QT 事件总结

一、Qt 的事件处理,有五个层次:

1. 重写 paintEvent()mousePressEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。

2. 重写 event()函数。event()函数是所有对象的事件入口,QObjectQWidget 中的实现,默认是把事件传递给特定的事件处理函数。

3. 在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。

4. 在 QCoreApplication::instance()上面安装事件过滤器 app.installEventFilter() 。该过滤器将过滤所有对象的所有事件,因此和 notify() 函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。

5. 重写 QCoreApplication::notify() 函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为 QCoreApplication 是单例的)。

这几个层次的事件处理方式的 调用顺序 ,5 --> 4 --> 3 --> 2 --> 1

二、界面假死现象

循环事件阻塞带来的最大问题就是造成界面假死,长时间没有事件响应,系统的窗口管理程序就会建议用户强制停止程序(应该都遇到过这种问题)。

解决该问题方法有三种(参考文献2):这里我们只讲和事件循环有关的两种就解决方法;

1、如果长时间任务是一个回调函数或循环体 就可以在函数内部使用qApp->processEvents; 强制分发事件。该方法问题:可能导致递归。

     解决:qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
2、自己实例化一个QEventloop类 开启一个本地事件循环。  一样的问题:也是可能导致递归
 

参考文献:

剖析Qt事件机制原理

事件循环

 事件循环嵌套

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值