Qt事件系统
博文内容是对《Qt Creator快速入门(第3版)》(霍亚飞)知识内容的总结概括。
- 什么是事件?
- 如何处理事件?
- 事件的传递
- 定时器事件
- 注意事项
什么是事件?
事件是对各种应用程序需要知道的由应用程序内部或外部产生的事情或者动作的通称。
如何处理事件?
任何继承自QObject的对象,都能用来处理事件。通常有以下五种方法:
- 重写部件的事件处理函数,比如paintEvent(),缺点是只能处理特定部件的特定事件;
- 重写notify()函数,优点是提供了完全的控制,先于事件过滤器得到事件;缺点是一次只能处理一个事件;
- 给QApplication对象添加事件过滤器,优点是能够处理多个事件;
- 重写event()事件函数,该函数先于事件处理函数得到事件;
- 在对象上安装事件过滤器。使用事件过滤器可以在一个界面类上同时处理不同子部件的不同事件。
事件的传递
事件传递用如下一张图来表示:
事件传递顺序:事件过滤器->焦点部件的event()函数->焦点部件的事件处理函数->父部件的事件处理函数。
定时器事件
QTimerEvent类用来表示一个定时器事件。可以利用int QObject::startTimer(int nInterval)函数来开启定时器。当定时时间到后便会触发QTimerEvent事件,可以在timerEvent事件处理函数中对事件进行处理。
也可以通过QTimer类来实现定时,新建一个QTimer类对象,并将该对象的定时器溢出信号绑定到需要处理该信号的槽上。通过start()函数开启定时,stop()函数停止定时。可以用QTimer::singleShort()函数来开启一个只运行一次的定时器。
qrand()函数用来产生随机数,qsrand()函数用来给其设置初值,如果不设置初值,那么每次运行程序qrand()函数都会产生一组相同的随机数。
注意事项
- QKeyEvent类用来表示一个键盘事件。当键盘被按下或释放时,键盘事件会发送给拥有键盘输入焦点的部件。在部件类中可以通过setFocus()函数获取焦点。