Qt自定义事件的实现

在Qt中我们会遇到两种事件一种是Qt中的系统时间了,另外一种就是Qt自定义事件。

Qt 的自定义事件主要的实现:

Qt 的事件处理,实际上是有五个层次:重定义事件处理函数,重定义event()函数,为单个组件安装事件过滤器,为QApplication安装事件过滤器,重定义QCoreApplication的notify()函数。这几个层次的控制权是逐层增大的。

重要函数:

virtual bool QCoreApplication::notify ( QObject * receiver, QEvent * event );

该函数会将 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,这个类的事件处理函数不想要这个事件

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值