QT 事件与事件循环

事件与信号的区别

      事件是针对于应用中的一个具体的目标对象,该对象决定了我们应该如何处理这个事件;而信号的发射是漫无目的的。所有的事件实例是QEvent的子类,且所有的QObject的派生类可以重载虚函数QObject::event()以实现对目标对象实例事件的处理。

      事件可以产生于应用程序的内部,也可以源于外部,比如QKeyEvent代表了与键盘的交互事件,来自于视窗体管理程序.....一个重要的事件并不会在产生时就立即被派发,而是列入到一个事件队列(Event queue)中,等待某一个时刻再发送。这个分发过程由分配器(dispatcher)处理,它会遍历事件队列,将入栈的事件发送到其对应的目标对象中,故它们被称作事件循环(event loop)

 

阻塞事件循环

      QT 的主体事件循环通过运行QCoreApplication::exec()进入,直至QCoreApplication::exit()或者QCoreApplication::quit()被调用才会结束这一事件循环。

      例如一个按钮的click信号绑定了一个对象的槽函数,而该槽函数中做了许多耗时的事情。则当我们点击button之后,当对象在繁忙的工作,处理槽函数中的耗时事情时,整个应用程序的事件循环被阻塞了,它只能等待event handler返回后才能继续分发其他的事件。

 

如何才能不阻塞事件循环?

    1、将耗时任务移至一个新的独立线程

    2、强制事件循环

          (1)调用QCoreApplication::processEvents()人工强迫事件循环运行,它会处理所有事件队列中的事件并返回给调用者

          (2)调用QEventLoop::exec()重入事件循环

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值