事件与信号的区别
事件是针对于应用中的一个具体的目标对象,该对象决定了我们应该如何处理这个事件;而信号的发射是漫无目的的。所有的事件实例是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()重入事件循环