Qt事件传播机制 day8

Qt事件传播机制 day8

事件的接受和忽略

  • 当空间忽略事件时,事件会继续往上传播,这里的传播指传播给父组件
  • QEvent有accept()函数与ignore()函数
    • accept():本组件处理该事件,这个事件就不会被继续传播给其父组件
    • ignore():本组件不想要处理这个事件,这个事件会被继续传播给其父组件
    • 所有的事件是默认接受的
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QKeyEvent>
class Button :public QPushButton
{
public:Button(const QString& text, QWidget* parent = nullptr) :QPushButton(text, parent){}
protected:bool event(QEvent* ev) override{if (ev->type() == QEvent::Type::KeyPress){//获取当前按下的按键QKeyEvent* kev = dynamic_cast<QKeyEvent*>(ev);qDebug() << Qt::Key(kev->key());//当回车键按下,我们忽略事件。原理是,我们直接在这返回,不会传递到父组件去进行处理,下面的信号的按钮按下就不会触发了//忽略事件return true;}return QPushButton::event(ev);//返回true表示事件已经处理完成,否则表示忽略}void mousePressEvent(QMouseEvent* ev) override{qDebug() << __FUNCSIG__;//ev->accept();//默认调用的ev->ignore();//忽略事件处理,事件将传播到父组件}
};class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent){Button* btn = new Button("小瓜",this);//设置按钮为默认按钮btn->setDefault(true);connect(btn, &Button::clicked, this, [](){qDebug() << "按钮按下";});}protected:void mousePressEvent(QMouseEvent* ev) override{qDebug() << __FUNCSIG__;}};int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.setWindowIcon(QIcon(":/Resource/tubiao.ico"));w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述

事件传播机制和MyApp

事件分发

  • Qt的事件产生之后,不是直接传递给了对象的,需要经过一系列的过程。
    在这里插入图片描述
  • 事件首先由Qt的ServerApplication去接收来自于外部或内部的一些行为,鼠标点击,键盘输入,时钟事件等,分析并决定送往对应的对象去处理(内部管理机制),最后会调用[virtual] bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) 去处理,当然这个是虚函数,你可以在子类去重新实现它 。
  • 在notify(…)中,在发给对应的接收者前,会先把消息送给QApplication。所以如果想在你界面的Widget前先处理那些事 件,那么你可以给QApplication对象installEventFilter,然后在对应的eventFilter()里先把这些事件都给过一 遍,然后你可以过滤一些不必要事件。
  • 如果QApplication没有处理那些事件,然后就是交给事件接收对象了。在这个对象接收前,也可以为这对象加一个事件过滤器,同样是 installEventFilter。
  • 如果eventFilter没有过滤某些事件,那么就会将事件交给接收者的event()函数(你可以根据不同类型的事件尽情处理),如果event事件在接受者处理后,也不会上传给父类的event,否则会上传进入父类的event。
  • 默认event()函数根据事件类型会调用不同的事件处理函数,类似mousePressEvent(),keyPressEvent()去分别处理他们。
    在这里插入图片描述
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QKeyEvent>//作为单独的一个实例
#define myApp static_cast<MyApp*>(qApp)//应用程序类
class MyApp :public QApplication
{
public://将其构造函数继承过来using QApplication::QApplication;//一般不会用这个函数,因为无论是那个窗口那个对象的事件都会通过这个函数来发//除非你真的需要无论在那个窗口或者那个键需要干什么事情,在来这个上面写//重写notify/*bool notify(QObject* receiver, QEvent* ev) override{if (ev->type() == QEvent::Close){qDebug() << "退出";}return true;}*///放一些所有程序或者是窗口可能会访问的数据,就可以不用全局变量了void addValue(const QString& key, const QVariant& v){m_config.insert(key, v);}QVariant value(const  QString& key){return m_config.value(key);}
protected:QMap<QString, QVariant> m_config;
};class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent),btn(new QPushButton("获取信息", this)){connect(btn, &QPushButton::clicked, this, [](){qDebug() << myApp->value("appName") << myApp->value("version");});}protected:QPushButton* btn{};
};int main(int argc, char* argv[])
{MyApp a(argc, argv);a.addValue("appName", "小瓜");a.addValue("version", "1.0");Widget w;w.setWindowIcon(QIcon(":/Resource/tubiao.ico"));w.show();return a.exec();
}
#include "main.moc"
  • 运行结果
    在这里插入图片描述

安装事件过滤器

  • QObject::installEventFilter()函数通过设置一个事件过滤器来实现这一点,使指定的过滤器对象在其QObject::eventFilter()函数中接收目标对象的事件。
  • eventFilter返回false允许对事件进行进一步处理,返回true停止处理
    在这里插入图片描述
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QKeyEvent>//单独写一个类来过滤
class SEventFilterObject :public QObject
{
public://这样才没有内存泄漏SEventFilterObject(QObject* parent = nullptr) :QObject(parent){}~SEventFilterObject() {qDebug() << __FUNCTION__;}bool eventFilter(QObject* watched, QEvent* event){if (event->type() == QEvent::MouseButtonPress){return true;//返回true表示被处理了,不会发到event了}else if (event->type() == QEvent::MouseButtonDblClick){return true;}return false;}
};
class Widget :public QWidget
{Q_OBJECT
public:Widget(QWidget* parent = nullptr) :QWidget(parent){//安装事件过滤器//installEventFilter(this);installEventFilter(new SEventFilterObject);//取消安装事件过滤器//installEventFilter(nullptr);}
protected://事件过略器//bool eventFilter(QObject* watched, QEvent* event)//{//	if (event->type() == QEvent::MouseButtonPress)//	{//		return true;//返回true表示被处理了,不会发到event了//	}//	else if (event->type() == QEvent::MouseButtonDblClick)//	{//		return true;//	}	//	return false; //}void mousePressEvent(QMouseEvent* ev) override{qDebug() << __FUNCSIG__;}
};int main(int argc, char* argv[])
{QApplication a(argc, argv);Widget w;w.setWindowIcon(QIcon(":/Resource/tubiao.ico"));w.show();return a.exec();
}
#include "main.moc"
  • 运行结果,鼠标点击已经无法生效事件输出
    在这里插入图片描述

无边框窗口(异形窗口)的拖动

  • 思路
    在这里插入图片描述
  • SEventFilterObject.cpp
#include "SEventFilterObject.h"SEventFilterObject::SEventFilterObject(QObject* parent):QObject(parent)
{}SEventFilterObject::~SEventFilterObject()
{std::cout<< __FUNCTION__;
}bool SEventFilterObject::eventFilter(QObject* watched, QEvent* event)
{QWidget* w = dynamic_cast<QWidget*>(watched);//如果窗口没有边框,才对点击窗口客户区移动窗口if (w->windowFlags() & Qt::FramelessWindowHint){//获取鼠标点击事件QMouseEvent* ev = dynamic_cast<QMouseEvent*>(event);if (event->type() == QEvent::MouseButtonPress && ev->button() == Qt::MouseButton::LeftButton){m_pos = ev->pos();}else if (event->type() == QEvent::MouseButtonRelease && ev->button() == Qt::MouseButton::LeftButton){m_pos = { 0,0 };}else if (event->type() == QEvent::MouseMove && ev->buttons() & Qt::LeftButton){w->move(ev->globalPos() - m_pos);}}return false;
}
  • SEventFilterObject.h
#ifndef SEVENTFILTEROBJECT_H_
#define SEVENTFILTEROBJECT_H_
#include <iostream>
#include <QObject>
#include <QWidget>
#include <QEvent>
#include <QPoint>
#include <QMouseEvent>class SEventFilterObject : public QObject
{
public://构造函数SEventFilterObject(QObject* parent = nullptr);~SEventFilterObject();bool eventFilter(QObject* watched, QEvent* event)override;
protected:QPoint m_pos;
};#endif // !SEVENTFILTEROBJECT_H_
  • main.cpp
#include <QApplication>
#include <QWidget>
#include <QMouseEvent>
#include <QPushButton>
#include <QPointer>
#include "SEventFilterObject.h"
class Widget :public QWidget
{
public:Widget(QWidget* parent = nullptr) :QWidget(parent),m_close(new QPushButton("X",this)){resize(400, 400);m_close->setFixedSize(50, 50);m_close->move(width() - m_close->width(), 0);//设置鼠标追踪setMouseTracking(true);//去掉窗口边框setWindowFlag(Qt::FramelessWindowHint, true);//安装过滤器installEventFilter(new  SEventFilterObject(this));connect(m_close, &QPushButton::clicked, this, [=](){close();});}~Widget(){qDebug() << __FUNCTION__;}
protected:private:QPushButton* m_close{};
};
int main(int argc,char* argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
  • 运行结果
    请添加图片描述

事件类型

这个枚举类型定义了Qt中有效的事件类型。事件类型和每个类型的专门类如下:

常量描述
QEvent::None0不是一个事件
QEvent::ActionAdded114一个新 action 被添加(QActionEvent)
QEvent::ActionChanged113一个 action 被改变(QActionEvent)
QEvent::ActionRemoved115一个 action 被移除(QActionEvent)
QEvent::ActivationChange99Widget 的顶层窗口激活状态发生了变化
QEvent::ApplicationActivate121这个枚举已被弃用,使用 ApplicationStateChange 代替
QEvent::ApplicationActivatedApplicationActivate这个枚举已被弃用,使用 ApplicationStateChange 代替
QEvent::ApplicationDeactivate122这个枚举已被弃用,使用 ApplicationStateChange 代替
QEvent::ApplicationFontChange36应用程序的默认字体发生了变化
QEvent::ApplicationLayoutDirectionChange37应用程序的默认布局方向发生了变化
QEvent::ApplicationPaletteChange38应用程序的默认调色板发生了变化
QEvent::ApplicationStateChange214应用程序的状态发生了变化
QEvent::ApplicationWindowIconChange35应用程序的图标发生了变化
QEvent::ChildAdded68一个对象获得孩子(QChildEvent)
QEvent::ChildPolished69一个部件的孩子被爆光(QChildEvent)
QEvent::ChildRemoved71一个对象时区孩子(QChildEvent)
QEvent::Clipboard40剪贴板的内容发生改变
QEvent::Close19Widget 被关闭(QCloseEvent)
QEvent::CloseSoftwareInputPanel200一个部件要关闭软件输入面板(SIP)
QEvent::ContentsRectChange178部件内容区域的外边距发生改变
QEvent::ContextMenu82上下文弹出菜单(QContextMenuEvent)
QEvent::CursorChange183部件的鼠标发生改变
QEvent::DeferredDelete52对象被清除后将被删除(QDeferredDeleteEvent)
QEvent::DragEnter60在拖放操作期间鼠标进入窗口部件(QDragEnterEvent)
QEvent::DragLeave62在拖放操作期间鼠标离开窗口部件(QDragLeaveEvent)
QEvent::DragMove61拖放操作正在进行(QDragMoveEvent)
QEvent::Drop63拖放操作完成(QDropEvent)
QEvent::DynamicPropertyChange170动态属性已添加、更改或从对象中删除
QEvent::EnabledChange98部件的 enabled 状态已更改
QEvent::Enter10鼠标进入部件的边界(QEnterEvent)
QEvent::EnterEditFocus150编辑部件获得焦点进行编辑,必须定义 QT_KEYPAD_NAVIGATION
QEvent::EnterWhatsThisMode124当应用程序进入“What’s This?”模式,发送到 toplevel 顶层部件
QEvent::Expose206当其屏幕上的内容无效,发送到窗口,并需要从后台存储刷新
QEvent::FileOpen116文件打开请求(QFileOpenEvent)
QEvent::FocusIn8部件或窗口获得键盘焦点(QFocusEvent)
QEvent::FocusOut9部件或窗口失去键盘焦点(QFocusEvent)
QEvent::FocusAboutToChange23部件或窗口焦点即将改变(QFocusEvent)
QEvent::FontChange97部件的字体发生改变
QEvent::Gesture198触发了一个手势(QGestureEvent)
QEvent::GestureOverride202触发了手势覆盖(QGestureEvent)
QEvent::GrabKeyboard188Item 获得键盘抓取(仅限 QGraphicsItem)
QEvent::GrabMouse186项目获得鼠标抓取(仅限 QGraphicsItem)
QEvent::GraphicsSceneContextMenu159在图形场景上的上下文弹出菜单(QGraphicsScene ContextMenuEvent)
QEvent::GraphicsSceneDragEnter164在拖放操作期间,鼠标进入图形场景(QGraphicsSceneDragDropEvent)
QEvent::GraphicsSceneDragLeave166在拖放操作期间鼠标离开图形场景(QGraphicsSceneDragDropEvent)
QEvent::GraphicsSceneDragMove165在场景上正在进行拖放操作(QGraphicsSceneDragDropEvent)
QEvent::GraphicsSceneDrop167在场景上完成拖放操作(QGraphicsSceneDragDropEvent)
QEvent::GraphicsSceneHelp163用户请求图形场景的帮助(QHelpEvent)
QEvent::GraphicsSceneHoverEnter160鼠标进入图形场景中的悬停项(QGraphicsSceneHoverEvent)
QEvent::GraphicsSceneHoverLeave162鼠标离开图形场景中一个悬停项(QGraphicsSceneHoverEvent)
QEvent::GraphicsSceneHoverMove161鼠标在图形场景中的悬停项内移动(QGraphicsSceneHoverEvent)
QEvent::GraphicsSceneMouseDoubleClick158鼠标在图形场景中再次按下(双击)(QGraphicsSceneMouseEvent)
QEvent::GraphicsSceneMouseMove155鼠标在图形场景中移动(QGraphicsSceneMouseEvent)
QEvent::GraphicsSceneMousePress156鼠标在图形场景中按下(QGraphicsSceneMouseEvent)
QEvent::GraphicsSceneMouseRelease157鼠标在图形场景中释放(QGraphicsSceneMouseEvent)
QEvent::GraphicsSceneMove182部件被移动(QGraphicsSceneMoveEvent)
QEvent::GraphicsSceneResize181部件已调整大小(QGraphicsSceneResizeEvent)
QEvent::GraphicsSceneWheel168鼠标滚轮在图形场景中滚动(QGraphicsSceneWheelEvent)
QEvent::Hide18部件被隐藏(QHideEvent)
QEvent::HideToParent27子部件被隐藏(QHideEvent)
QEvent::HoverEnter127鼠标进入悬停部件(QHoverEvent)
QEvent::HoverLeave128鼠标留离开悬停部件(QHoverEvent)
QEvent::HoverMove129鼠标在悬停部件内移动(QHoverEvent)
QEvent::IconDrag96窗口的主图标被拖走(QIconDragEvent)
QEvent::IconTextChange101部件的图标文本发生改变(已弃用)
QEvent::InputMethod83正在使用输入法(QInputMethodEvent)
QEvent::InputMethodQuery207输入法查询事件(QInputMethodQueryEvent)
QEvent::KeyboardLayoutChange169键盘布局已更改
QEvent::KeyPress6键盘按下(QKeyEvent)
QEvent::KeyRelease7键盘释放(QKeyEvent)
QEvent::LanguageChange89应用程序翻译发生改变
QEvent::LayoutDirectionChange90布局的方向发生改变
QEvent::LayoutRequest76部件的布局需要重做
QEvent::Leave11鼠标离开部件的边界
QEvent::LeaveEditFocus151编辑部件失去编辑的焦点,必须定义 QT_KEYPAD_NAVIGATION
QEvent::LeaveWhatsThisMode125当应用程序离开“What’s This?”模式,发送到顶层部件
QEvent::LocaleChange88系统区域设置发生改变
QEvent::NonClientAreaMouseButtonDblClick176鼠标双击发生在客户端区域外
QEvent::NonClientAreaMouseButtonPress174鼠标按钮按下发生在客户端区域外
QEvent::NonClientAreaMouseButtonRelease175鼠标按钮释放发生在客户端区域外
QEvent::NonClientAreaMouseMove173鼠标移动发生在客户区域外
QEvent::MacSizeChange177用户更改了部件的大小(仅限 OS X)
QEvent::MetaCall43通过 QMetaObject::invokeMethod() 调用异步方法
QEvent::ModifiedChange102部件修改状态发生改变
QEvent::MouseButtonDblClick4鼠标再次按下(QMouseEvent)
QEvent::MouseButtonPress2鼠标按下(QMouseEvent)
QEvent::MouseButtonRelease3鼠标释放(QMouseEvent)
QEvent::MouseMove5鼠标移动(QMouseEvent)
QEvent::MouseTrackingChange109鼠标跟踪状态发生改变
QEvent::Move13部件的位置发生改变(QMoveEvent)
QEvent::NativeGesture197系统检测到手势(QNativeGestureEvent)
QEvent::OrientationChange208屏幕方向发生改变(QScreenOrientationChangeEvent)
QEvent::Paint12需要屏幕更新(QPaintEvent)
QEvent::PaletteChange39部件的调色板发生改变
QEvent::ParentAboutToChange131部件的 parent 将要更改
QEvent::ParentChange21部件的 parent 发生改变
QEvent::PlatformPanel212请求一个特定于平台的面板
QEvent::PlatformSurface217原生平台表面已创建或即将被销毁(QPlatformSurfaceEvent)
QEvent::Polish75部件被抛光
QEvent::PolishRequest74部件应该被抛光
QEvent::QueryWhatsThis123如果部件有“What’s This?”帮助,应该接受事件
QEvent::ReadOnlyChange106部件的 read-only 状态发生改变
QEvent::RequestSoftwareInputPanel199部件想要打开软件输入面板(SIP)
QEvent::Resize14部件的大小发生改变(QResizeEvent)
QEvent::ScrollPrepare204对象需要填充它的几何信息(QScrollPrepareEvent)
QEvent::Scroll205对象需要滚动到提供的位置(QScrollEvent)
QEvent::Shortcut117快捷键处理(QShortcutEvent)
QEvent::ShortcutOverride51按下按键,用于覆盖快捷键(QKeyEvent)
QEvent::Show17部件显示在屏幕上(QShowEvent)
QEvent::ShowToParent26子部件被显示
QEvent::SockAct50Socket 激活,用于实现 QSocketNotifier
QEvent::StateMachineSignal192信号被传递到状态机(QStateMachine::SignalEvent)
QEvent::StateMachineWrapped193事件是一个包装器,用于包含另一个事件(QStateMachine::WrappedEvent)
QEvent::StatusTip112状态提示请求(QStatusTipEvent)
QEvent::StyleChange100部件的样式发生改变
QEvent::TabletMove87Wacom 写字板移动(QTabletEvent)
QEvent::TabletPress92Wacom 写字板按下(QTabletEvent)
QEvent::TabletRelease93Wacom 写字板释放(QTabletEvent)
QEvent::OkRequest94Ok 按钮在装饰前被按下,仅支持 Windows CE
QEvent::TabletEnterProximity171Wacom 写字板进入接近事件(QTabletEvent),发送到 QApplication
QEvent::TabletLeaveProximity172Wacom 写字板离开接近事件(QTabletEvent),发送到 QApplication
QEvent::ThreadChange22对象被移动到另一个线程。这是发送到此对象的最后一个事件在上一个线程中,参见:QObject::moveToThread()
QEvent::Timer1定时器事件(QTimerEvent)
QEvent::ToolBarChange120工具栏按钮在 OS X 上进行切换
QEvent::ToolTip110一个 tooltip 请求(QHelpEvent)
QEvent::ToolTipChange184部件的 tooltip 发生改变
QEvent::TouchBegin194触摸屏或轨迹板事件序列的开始(QTouchEvent)
QEvent::TouchCancel209取消触摸事件序列(QTouchEvent)
QEvent::TouchEnd196触摸事件序列结束(QTouchEvent)
QEvent::TouchUpdate195触摸屏事件(QTouchEvent)
QEvent::UngrabKeyboard189Item 失去键盘抓取(QGraphicsItem)
QEvent::UngrabMouse187Item 失去鼠标抓取(QGraphicsItem、QQuickItem)
QEvent::UpdateLater78部件应该排队在以后重新绘制
QEvent::UpdateRequest77部件应该被重绘
QEvent::WhatsThis111部件应该显示“What’s This”帮助(QHelpEvent)
QEvent::WhatsThisClicked118部件的“What’s This”帮助链接被点击
QEvent::Wheel31鼠标滚轮滚动(QWheelEvent)
QEvent::WinEventAct132发生了 Windows 特定的激活事件
QEvent::WindowActivate24窗口已激活
QEvent::WindowBlocked103窗口被模态对话框阻塞
QEvent::WindowDeactivate25窗户被停用
QEvent::WindowIconChange34窗口的图标发生改变
QEvent::WindowStateChange105窗口的状态(最小化、最大化或全屏)发生改变(QWindowStateChangeEvent)
QEvent::WindowTitleChange33窗口的标题发生改变
QEvent::WindowUnblocked104一个模态对话框退出后,窗口将不被阻塞
QEvent::WinIdChange203本地窗口的系统标识符发生改变
QEvent::ZOrderChange126部件的 z 值发生了改变,该事件不会发送给顶层窗口

用户事件的值应该介于 QEvent:: 和 QEvent::MaxUser之间。

常量描述
QEvent::User1000用户定义的事件
QEvent::MaxUser65535最后的用户事件 ID

为方便起见,可以使用 [static] int QEvent::registerEventType(int *hint* = -1) 函数来注册和存储一个自定义事件类型,这样做会避免意外地重用一个自定义事件类型。

信号与事件的区别

事件(QEvent)信号(SIGNAL)
与QObject的关系由具体对象进行处理由具体对象主动产生
对程序影响改写事件处理函数可能导致程序行为发生改变信号是否存在对应的槽函数不会改变程序行为
两者的联系一般而言,信号在具体的事件处理函数中产生

信号和事件是两个不同层面的东西,发出者不同,作用不同。Qt中,所有的QObject的子类实例均可对事件接收和处理!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/161429.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++文件操作(细节满满,part2)

该文章上一篇&#xff1a;C/C文件操作&#xff08;细节满满&#xff0c;part1&#xff09;_仍有未知等待探索的博客-CSDN博客 个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 …

儿童口腔卫生:建立健康微笑的基石

引言 儿童口腔卫生是维护健康的关键部分&#xff0c;它不仅影响口腔健康&#xff0c;还对全身健康产生必然影响。本文将探讨一些儿童口腔卫生的重要性以及儿童的关键注意事项&#xff0c;以帮助家长和监护人确保儿童拥有健康的口腔。 第一部分&#xff1a;儿童口腔卫生的重要性…

【LeetCode热题100】--31.下一个排列

31.下一个排列 思路&#xff1a; 方法&#xff1a;两遍扫描 注意到下一个排列总是比当前排列要大&#xff0c;除非该排列已经是最大的排列。我们希望找到一种方法&#xff0c;能够找到一个大于当前序列的新序列&#xff0c;且变大的幅度尽可能小。具体地&#xff1a; 我们需要…

GEO生信数据挖掘(九)WGCNA分析

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 第八节对差异基因进行富集分析。…

智慧渔业方案:AI渔政视频智能监管平台助力水域禁渔执法

一、方案背景 国内有很多水库及河流设立了禁渔期&#xff0c;加强渔政执法监管对保障国家渔业权益、维护渔业生产秩序、保护渔民群众生命财产安全、推进水域生态文明建设具有重要意义。目前&#xff0c;部分地区的监管手段信息化水平低下&#xff0c;存在人员少、职责多、任务…

JavaScript反爬虫技巧详细攻略

目录 1、动态生成内容 2、使用JavaScript混淆和压缩 3、使用CORS策略 4、检测用户行为 5、利用用户代理标识符 6、图片替代和隐藏字段 7、使用反爬虫服务 在当今的web开发中&#xff0c;JavaScript已经成为了一个不可或缺的部分。然而&#xff0c;这也引发了一个问题&am…

老师如何发布考试成绩?

成绩查询页面是什么&#xff1f;如何用各种代码、Excel来实现让学生自助查询成绩&#xff1f; 作为老师&#xff0c;发布考试成绩是教学过程中的一个重要环节。传统的做法是&#xff0c;老师手动计算每个学生的分数&#xff0c;然后将成绩单打印出来并逐个发放给学生。这种方式…

MyBatisPlus(二十)防全表更新与删除

说明 针对 update 和 delete 语句&#xff0c;阻止恶意的全表更新和全表删除。 实现方式 配置BlockAttackInnerInterceptor拦截器 代码 package com.example.core.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.p…

JVM第七讲:JVM 基础 - Java 内存模型详解

JVM 基础 - Java 内存模型详解 本文是JVM第七讲&#xff0c;JVM 基础 - Java 内存模型详解。主要转载自 Info 上深入理解Java内存模型, 作者程晓明。这篇文章对JMM讲的很清楚了&#xff0c;大致分三部分&#xff1a;1、重排序与顺序一致性&#xff1b;2、三个同步原语&#xff…

竞赛 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

2024年孝感市建筑类中级职称申报资料私企VS国企

2024年孝感市建筑类中级职称申报资料私企VS国企 民营企业中级职称申报跟事业单位或者是国企申报中级职称流程不一样么&#xff1f;实际上流程基本都是相同的&#xff0c;就是提交纸质版资料有点不一样。 孝感市建筑类中级职称申报基本流程 1.参加建筑类中级职称水平能力测试。 …

微信小程序前端生成动态海报图

//页面显示<canvas id"myCanvas" type"2d" style" width: 700rpx; height: 600rpx;" />onShareShow(e){var that this;let user_id wx.getStorageSync(user_id);let sharePicUrl wx.getStorageSync(sharePicUrl);if(app.isBlank(user_i…

【京东开源项目】微前端框架MicroApp 1.0正式发布

介绍 MicroApp是由京东前端团队推出的一款微前端框架&#xff0c;它从组件化的思维&#xff0c;基于类WebComponent进行微前端的渲染&#xff0c;旨在降低上手难度、提升工作效率。MicroApp无关技术栈&#xff0c;也不和业务绑定&#xff0c;可以用于任何前端框架。 源码地址…

最新ai创作系统CHATGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

出详图和工程图(上)-SOLIDWORKS 2024新功能

保持尺寸链共线 即使空间有限&#xff0c;您也可以确保尺寸链保持共线。 当尺寸文本和箭头重叠时&#xff0c;您可以选择最合适的选项。 要在尺寸文本重叠时保持尺寸链共线&#xff1a; 1. 单击工具 > 选项 > 文档属性 > 尺寸 > 线性 > 尺寸链。 2. 在共线选…

【论文阅读】 Cola-Dif; An explainable task-specific synthesis network

文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…

基于吉萨金字塔建造优化的BP神经网络(分类应用) - 附代码

基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.吉萨金字塔建造优化BP神经网络3.1 BP神经网络参数设置3.2 吉萨金字…

nginx正向代理、反向代理、负载均衡(重中之重)

nginx中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;基于tcp或udp的流量转发&#xff09; 一、七层代理 原理&#xff1a;客户端请求代理服务器&#xff0c;由代理服务器转发客户端的http请求&#xff0c;转发到内部的服务器…

YAPI介绍及Docker Compose部署指南

我们团队的项目最初前后端是同一个开发人员在做&#xff0c;因此并不存在提供详细接口文档等问题。随着项目的不断迭代&#xff0c;团队规模逐渐扩大&#xff0c;我们决定将前后端分开&#xff0c;专门由专业的前端和后端人员进行开发工作。然而&#xff0c;这样的改变也带来了…

Systrace学习笔记

Systrace学习笔记 1.Systrace快捷键2.线程状态3.CPU info4.图形化4.1 Frames帧4.2 用户活动4.3 CPU活动4.4 系统事件 5. SystemServer5.1 SystemServer简介5.2 窗口动画5.3 AMS(ActivityManagerService)5.4 WMS(WindowMagerService)5.5 ServiceThread5.6 HandlerThread 6. Surf…