什么是消息循环
最简单的理解就是系统、程序创建的一个队列,不断的由“各种输入”压到队尾,然后不断的从队首取当前内所有消息,并逐一执行。
消息的类型
系统:鼠标点击移动、键盘点击、输入;
程序:GUI绘制、创建、销毁;
QT的消息循环与系统原生消息的区别(以windows为例)
- Qt 接管了操作系统的原生的GUI消息,并转义成Qt的内部消息,分发给当前应用程序的QObject
- Qt 支持对消息进行自定义过滤和分发
bool eventFilter(QObject *obj, QEvent *event) override;
- Qt还同时支持处理操作系统的原生消息
nativeEvent(const QByteArray &eventType, void *message, long *result)
Qt消息循环的级别
先说个人结论 5个级别,从全局到具体消息如下
- QApplication::notify(QObject *receiver, QEvent *e)
Qt的GUi程序都是由QApplication::notify()接管来自全局的SendMessage和PostMessage
- bool QApplication eventFilter(QObject *watched, QEvent *event)
我们可以通过给qApp装上事件过滤器,这样可以全局某些事件的分发控制
- Qt 对象的bool eventFilter(QObject *watched, QEvent *event)
每个QObject对象的可以通过eventFilter优先处理成对应的逻辑,比如:全局有两个QLabel,我们分别为eventFiler拦截点击事件,使得A点击后响应变蓝,B点击后响应变红
- 重载bool event(QEvent *event)
经历了从底向上的派发,如果事件没有被过滤掉或处理,接收者会在bool event(QEvent *event)调用预先定义好的事件处理函数。一般这些事件处理函数处理完毕后会对消息进行标识QEvent::ignore() 或 QEvent::accept()
- 常见重载特定事件处理函数,如:mousePressEvent(QMouseEvent *event)、keyPressEvent(QKeyEvent *event),
可以针对不同对象、不同的特定消息进行自定义操作,具体没啥好说的···
3168

被折叠的 条评论
为什么被折叠?



