Qt 事件
- App 产生事件
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)
void QCoreApplication::sendPostedEvents(QObject *receiver = Q_NULLPTR, int
return a.exec() 的本质是不停的调用 processEvent() 函数从队列中取出事件来处理。
- 事件到达控件A,执行控件A的 bool event(QEvent *e) 函数。
如果控件A被控件B所监控,则先执行控件B的eventFilter,若该函数返回true则不把事件传给控件A。
- bool event(QEvent *e) 函数,实质是一个分发器,根据事件的类型分发到对应的事件处理函数。
如 QEvent::GraphicsSceneMousePress 类型的事件,会产生一个 QMouseEvent,传给 mousePressEvent 事件处理函数。
- 事件处理函数。
默认情况下,事件处理函数会 accept 事件,这样事件就不会传播给父组件。
需要注意的是,如果 QWidget W 里面有 QLineEdit le,那么 W 事件不包含 le 的事件,
具体来说,W 的 bool event(QEvent *e) 不能捕获到 le 的事件。
如果要捕获 le 的事件,需要用 W 监控 le,也就是 W 实现 _eventFilter ,le._installEventFilter(W)。
Windows 消息
类似 Qt 的 event 函数,所有独立窗体(has a native window handle)的原生 Windows 消息都会经过函数:
bool nativeEvent(const QByteArray &eventType, void message, long result)
如果是一个附属于其他窗体的控件则不会调用该函数。event 就没有这个限制。
同样地,该函数只能捕获独立窗体的Windows原生消息,而无法捕获窗体里面控件的Windows消息。
如果该窗体有一个 QLineEdit le,则 le 的 WMCHAR 消息不会被该窗体的 _nativeEvent 函数所捕获。
而 le 的类哪怕重载了 nativeEvent 也不行,因为 le 作为嵌入控件,该函数自动失效。
_
那么用 Qt 如何捕获子控件的 Windows 原生消息呢?