• Qt事件传播机制 day8


    Qt事件传播机制 day8

    事件的接受和忽略

    • 当空间忽略事件时,事件会继续往上传播,这里的传播指传播给父组件
    • QEvent有accept()函数与ignore()函数
      • accept():本组件处理该事件,这个事件就不会被继续传播给其父组件
      • ignore():本组件不想要处理这个事件,这个事件会被继续传播给其父组件
      • 所有的事件是默认接受的
    #include 
    #include 
    #include 
    #include 
    #include 
    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 运行结果
      在这里插入图片描述

    事件传播机制和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 
    #include 
    #include 
    #include 
    #include 
    
    //作为单独的一个实例
    #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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 运行结果
      在这里插入图片描述

    安装事件过滤器

    • QObject::installEventFilter()函数通过设置一个事件过滤器来实现这一点,使指定的过滤器对象在其QObject::eventFilter()函数中接收目标对象的事件。
    • eventFilter返回false允许对事件进行进一步处理,返回true停止处理
      在这里插入图片描述
    #include 
    #include 
    #include 
    #include 
    #include 
    
    //单独写一个类来过滤
    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 运行结果,鼠标点击已经无法生效事件输出
      在这里插入图片描述

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

    • 思路
      在这里插入图片描述
    • 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • SEventFilterObject.h
    #ifndef SEVENTFILTEROBJECT_H_
    #define SEVENTFILTEROBJECT_H_
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    class SEventFilterObject : public QObject
    {
    public:
    	//构造函数
    	SEventFilterObject(QObject* parent = nullptr);
    	~SEventFilterObject();
    	bool eventFilter(QObject* watched, QEvent* event)override;
    protected:
    	QPoint m_pos;
    };
    
    #endif // !SEVENTFILTEROBJECT_H_
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • main.cpp
    #include 
    #include 
    #include 
    #include 
    #include 
    #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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 运行结果
      请添加图片描述

    事件类型

    这个枚举类型定义了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的子类实例均可对事件接收和处理!

  • 相关阅读:
    运筹说 第82期 | 算法介绍之图与网络分析(二)
    [工业互联-4]:工业有线互联总线之IO-Link
    JAVA开发管理(敏捷如何解决实际痛点问题)
    简化城镇开发边界基数统计工作——基于ModelBuilder的“基数汇总范围图层”的制作思路
    Mac电脑使用万能头文件教程(详细)
    SpringCloud-Gateway解决跨域问题
    7种设计模式
    Python小游戏-Las Vegas Black Jack- CASINO (21点)
    两条命令解决移动硬盘无法弹出的问题
    AndroidX使用Paho MQTT报找不到android/support/v4/content/LocalBroadcastManager
  • 原文地址:https://blog.csdn.net/qq_44924388/article/details/133809469