Qt事件发送--sendEvent和postEvent

在Qt程序中,用户主动发送事件的方式有两种,分别是sendEvent和postEvent,本文对这两种方式的实现和用法进行讲解。

sendEvent

官方文档说明:

使用notify()函数将事件事件直接发送到接收方。返回从事件处理程序返回的值。 发送事件后,不会删除该事件。通常的方法是在堆栈上创建事件。

用法:

QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::sendEvent(mainWindow, &event);

sendEvent的本质就是调用notify函数,相当于直接触发一次事件。
因为是同步触发,所以有以下几点需要注意:
1、如果event是堆空间(new出来的)上的对象,需要手动删除。
2、跨线程调用时需要注意线程安全问题,最好不要跨线程使用。

postEvent

官方文档说明:

将事件事件添加到事件队列中,对象接收器作为事件的接收器,并立即返回。
必须在堆上分配事件,因为发布事件队列将获得事件的所有权,并在发布后将其删除。在发布事件后访问该事件是不安全的。
当控制返回到主事件循环时,将使用notify()函数发送队列中存储的所有事件。
事件按优先级降序排序,即优先级较高的事件在优先级较低的事件之前排队。优先级可以是任何整数值,即在INT_MAX和INT_MIN之间,包括在内;有关详细信息,请参见Qt::EventPriority。具有同等优先级的事件将按发布顺序处理。

用法:

QMouseEvent *event = new QMouseEvent (QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::postEvent(mainWindow, event);

postEvent是将事件对象加入到一个QVector中,在目标对象的下一次事件循环时通过sendEvent来触发事件。
相比sendEvent,它有以下几个特点:
1、传入的event对象必须为堆控件上的,不需要手动删除,不能重复使用,因为触发事件时会用智能指针QScopedPointer来管理,处理完事件就会被释放掉。
2、该方法是线程安全的,postSend内部用了锁来保护存放事件对象的QVector,事件也是在对象的事件循环中触发的。
3、事件不是实时触发的。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值