一、Qt事件简介:
1、 事件是对应用程序内部或者外部产生的事情或者动作的通称。
2、 Qt程序是事件驱动的,Qt事件的产生和处理是程序运行的主线,存在于程序的整个生命周期。
3、 Qt事件被封装为对象,所有的Qt事件均继承自抽象类QEvent。
4、 常见的事件如下:
(1)键盘事件: QKeyEvent
(2)鼠标事件: QMouseEvent
(3)拖拽事件: QDragEnterEvent
(4)滚轮事件: QWheelEvent
(5)绘制事件:QPaintEvent
(6)定时器事件: QTimerEvent
(7)焦点事件:QFocusEvent
(8)关闭事件:QCloseEvent
(9)窗口大小位置引起的事件:QResizeEvent
(10)上下文菜单事件:QContextMenuEvent
5、 一个事件可能包含多种事件类型,这些事件类型统一由QEvent::Type枚举类型表示,通过QEvent类的type()可获得具体的事件类型。如鼠标事件QMouseEvent又分为鼠标按下、鼠标释放、鼠标移动、鼠标双击事件类型。
6、 QEvent子类只能表示事件,但不能处理事件,在Qt中,任何QObject子类实例都可以接收和处理事件。(QObject三大职责: 内存管理、事件处理、内省(intropection))
7、 可在Qt帮助文档中搜索The Event System关键字查看。
二、Qt事件的产生和发送:
1、 事件可能由应用程序外部产生,即操作系统事件; 也可能由应用程序内部产生。
2、 由应用程序外部产生:
(1)、一般用户操作,如鼠标按下、键盘按键等,操作系统(的设备驱动程序)感知,向应用程序发送系统消息。
(2)、Qt的事件循环(非GUI程序的QCoreApplication或GUI程序的QApplication的exec()),监听到事件后生成一个事件对象(QEvent子类对象),放入到事件循环队列中。
(3)、Qt(QCoreApplication或QApplication)从事件循环队列中,取出一个事件对象,通过层层传递,最终会发送给目标QObject对象(一般是获得焦点的QWidget)。
(4)、如果目标QObject对象有自定义安装的事件过滤器,可能会在自定义事件过滤器中处理掉事件;如果没有自定义事件过滤器,则事件会到达目标QObject的event(QEvent *)函数。
(5)、event(QEvent *)函数会根据事件类型(QEvent的type())调用不同的事件处理函数。
(6)、在事件处理函数中发送预定义的信号,从而调用与信号关联的槽函数。
3、 由应用程序内部产生:
(1)、应用程序自己产生事件,有两种方式。
一种是调用QCoreApplication的postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority);
另一种是调用QCoreApplication的sendEvent(QObject *receiver, QEvent *event)。
(2)、postEvent和sendEvent区别:
a、sendEvent会使用notify()函数直接给receiver发送事件; post