事件机制
1、事件的来源
- 系统产生
比如用户按下键盘或鼠标,就会产生一个键盘事件或鼠标事件,这是由程序外部产生的事件。操作系统会将这些事件放到系统消息队列中去,进行下一个事件循环时,对该消息进行处理。 - Qt应用程序自身产生
程序产生事件的方式有两种。一种是调用QApplication::postEvent(),例如QWidget::update()函数,当重新绘制屏幕时,程序调用update函数,new出来一个paintEvent,调用QApplication::postEvent(),将其放入Qt的消息队列中,等待下一次事件循环再对其依次处理。另一种是调用QApplication::sendEvent函数,该方法不需要将事件放入事件队列中,而是直接被处理,QWidget::repaint函数就是这种方式。简单理解,前者是异步方式,后者是同步方式。
2、事件与事件循环
事件是由操作系统或程序框架在不同的时刻发生的。通俗来说,事件可以简单理解为信号,例如,用户按下鼠标、敲下键盘或者窗口进行重绘时所发出的信号,都可以理解为一个个事件。
所谓的事件循环,也可以称为消息循环。Qt作为一个跨平台的UI框架,其事件循环是对不同的平台的事件做了封装,对外提供统一的接口。
QEventLoop类是Qt中事件循环主要类,该类对外提供了几个接口:
// 启动并阻塞事件
int exec(QEventLoop::ProcessEventsFlags flags=AllEvents);
// 事件退出
void exit