在Qt中我们会遇到两种事件一种是Qt中的系统时间了,另外一种就是Qt自定义事件。
Qt 的自定义事件主要的实现:
Qt 的事件处理,实际上是有五个层次:重定义事件处理函数,重定义event()函数,为单个组件安装事件过滤器,为QApplication安装事件过滤器,重定义QCoreApplication的notify()函数。这几个层次的控制权是逐层增大的。
重要函数:
|
该函数会将 event 发送给 receiver,也就是调用 receiver->event(event),其返回值就是来自 receiver 的事件处理器。
QCoreApplication::sendEvent()或者QCoreApplication:;postEvent()的区别?
①static bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event);
直接将 event 事件发送给 receiver 接受者,使用的是 QCoreApplication::notify() 函数。函数返回值就是事件处理函数的返回值。在事件被发送的时候,event 对象并不会被销毁。通常我们会在栈上创建 event 对象,例如:
②static void QCoreApplication::postEvent(QObject *receiver, QEvent *event);
将 event 事件及其接受者 receiver 一同追加到事件队列中,函数立即返回。
因为 post 事件队列会持有事件对象,并且在其 post 的时候将其 delete 掉,因此,我们必须在堆上创建event 对象。当对象被发送之后,再试图访问 event 对象就会出现问题(因为 post 之后,event 对象就会被 delete)。
当控制权返回到主线程循环是,保存在事件队列中的所有事件都通过 notify() 函数发送出去。
事件会根据 post 的顺序进行处理。如果你想要改变事件的处理顺序,可以考虑为其指定一个优先级。默认的优先级是 Qt::NormalEventPriority。
这个函数是线程安全的。
简单的说就是:sendEvent()会把event直接使用QCoreApplication的notify()发送给receiver,postEvent()把event追加到事件队列中最终也要调用notify(),notify()把事件分发给参数中的receiver,如果receiver安装了eventFilter,那么event会发给定义这个事件过滤器的监控者,如果这个event没有被过滤,那么这个event会被传给receiver的event()函数,event()函数再把这个event传给与其相应的事件处理函数(诸如keyPressEvent()之类的函数)。这些事件处理函数这才是真正响应event的函数,它们才是真正干活的,到这里算是处理完了。
引用别人的代码实现:
解释:
大体的实现是按照
①自定义QEvent::Type 用到QEvent::registerEventType();这个函数。
②重写QCoreApplication::notify(QObject *receiver, QEvent *event)它主要负责把事件发给接受者。
③实现QObject 的eventFilter函数,进行事件的过滤。不过滤事件return false;
④重定义event()函数,重定义事件处理函数,处理函数中可以调用event->accept();event->ignore()正如它们的名字一样,前者用来告诉 Qt,这个类的事件处理函数想要这个事件;后者则告诉 Qt,这个类的事件处理函数不想要这个事件。