事件机制:
- Qt中定义的事件是一个从QEvent类继承下来的,它表示应用程序内部或者外部发生某些应用程序必须知道的事情
- Qt使用一个事件队列 对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部 。前一个事件完成后,取出后面的事件进行处理。但是,必要的时候,Qt 的事件也可以不进入事件队列,而是直接处理。
- 在Qt内部,Qt通过由函数****QApplication::exec()****函数启动的主事件循环从系统事件队列中抓取属于本程序事件并转化为QEvent对象
事件类图:
QMouseEvent: 鼠标点击
QKeyEvent: 键盘事件
QPaintEvent: 背景重绘事件
基于事件如何被产生与分发,可以把事件分为三类:
1.Spontaneous 事件:
由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。
例如: 鼠标,键盘,移动
2.Posted 事件:
由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环 处理。例如: update(),paintEvent()
3.Sent 事件: 发送后立即实现
由Qt或是应用程序产生,但它们被直接发送到目标对象。 repaint()
QEvent对象
QEvent对象是所有事件对象的基类,因此有必要了解该对象构成函数:
-enum Type
标识事件类型
-Type type () const
调用该函数,返回事件发生事件的类型(该类型为枚举)
常用的事件类型
常用的Qt事件类:
Qt为多数事件定义了特殊的类:
- QMouseEvent 鼠标事件
- QKeyEvent 键盘事件
- QResizeEvent窗体缩放事件
- QPaintEvent 窗体重绘事件
- QCloseEvent 窗体关闭事件: 可以询问是否确定要关闭或关闭后要做的事
- QFocusEvent 部件获得焦点事件
事件处理方法:
Qt提供了几种处理事件的方法:
- 重新实现特定的事件处理器
- 重新实现QObject::event()函数
- 继承QApplication并重新实现notify()函数
所有的事件查看方法: 所有的事件都是 虚函数->需要进行事件重写
编写事件步骤:
- 查看对应事件的函数
- 复制对应事件的函数的首部至protected:中
- 进行虚函数事件进行重写
重绘事件的重写:
1.缩放
三种设置窗口布局的方式:
重载event()函数
通过重载event()函数,我们可以在事件被特定的事件处理函数处理之前(象keyPressEvent())处理它. 比如, 当我们想改变tab键的默认动作时,一般要重载这个函数. 在处理一些不常见的事件当我们重载event()函数时, 需要调用父类的event()函数来处理我们不需要处理或是不清楚如何处理的事件.
事件过滤器
Qt事件模型中有一项非常强大的功能是一个Object实例可以监视另外一个QObject实列中的事件.实现方法就是在目标对象安装事件过滤器.这样事件到打目标对象之前首先获得该事件.从而起到监视作用
事件过滤器的实现: 假设要用A (注册界面) 来监视过滤B (注册按钮) 的事件
- 调用B的installEventFilter( const QOject *obj ), 以A的指针 作为参数. 这样所有发往B的事件都将先由A的eventFilter()处理.
- A(注册页面 )要重载QObject::eventFilter()函数, 在eventFilter() 中书写对事件进行处理的代码.
信号与事件的区别:
- 信号是由对象产生的;
- 信号产生与否或者信号存不存在,对槽函数的行为不会产生影响
- 事件由对象处理 改写事件的处理函数,使程序的执行发生变化 重写信号是在事件处理过程产生的,
以点击按钮为例:
qt接收到一个鼠标事件,事件放在qt事件循环里面,进行事件分发,
以QPushButton为例:
按下这个按钮是先触发的是mousePressEvent事件,在事件源码中会发射pressed()信号,松开按钮又触发mouseReleaseEvent事件,在事件源码中发射released()信号和clicked()信号,clicked()信号发出后,触发对应的slots槽函数,完成相应的操作。