QT 事件
2017-05-10 09:30
169 查看
http://blog.csdn.net/lpmygod/article/details/39135619
http://blog.csdn.net/pp634077956/article/details/50382526
http://blog.csdn.net/qq_19528953/article/details/52577294
QT 事件
事件(event)是有系统或者Qt本身在不同的时刻发出的。当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
一些事件是在对用户操作做出响应的时候发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
一般来说,使用Qt编程时,我们并不会把主要精力放在事件上,因为在Qt中,需要我们关心的事件总会发出一个信号。
比如,我们关心的是QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。
signal由具体对象发出,然后会马上交给由connect函数连接的slot进行处理;而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,
当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处理。
但是,必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。并且,事件还可以使用“事件过滤器”进行过滤。
总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。
比如,如果我们要自定义一个QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。
Qt设计者的做法是针对不同类型的事件提供不同的事件处理器与之对应,事件和事件处理器中间,桥梁就是QObject::event()函数,
该函数是虚函数,QObject的子类例如QWidget都实现了该函数。该函数的主要功能是进行事件的分发,也就是将不同类型的事件与之相对应的事件处理器相关联,
该函数并不对事件进行处理,真正的事件处理是在事件处理器中进行的。
1: 一种重写event函数,自己写事件函数(需要起名),中间可以事件过滤后再事件处理。
1、event()函数
首先是控制事件分发的event()函数,我们可以改写该函数,改变事件的分发方式,这样就可以改变事件处理的结果。
2、notify()函数
实现该函数可以截获事件,并对事件加以处理,但是该方法很少用,这里不做介绍。
3、事件过滤器
实现自己的事件过滤器就可以改变事件处理的方法和结果,这个方法比较常用。
总结起来就两个步骤:
第一:对目标对象调用installEventFilter()来注册监视对象(事件过滤器);
第二:重写监视对象的eventFilter()函数处理目标对象的事件。
4、事件处理器
事件处理的最后一步,也是最重要的一步就是事件处理器,因为它才是真正进行事件处理的地方,
我们可以改写以有的事件处理器,以此改变已有事件的处理方法和处理结果,
我们也可以定义自己的事件类型和相应的事件处理器。
2:重写控件的事件函数:
当我们自己定义组件的时候,我们就关心事件,因为我们需要通过重写事件的处理函数来设置我们自己定义的组件的功能.
http://blog.csdn.net/pp634077956/article/details/50382526
http://blog.csdn.net/qq_19528953/article/details/52577294
QT 事件
事件(event)是有系统或者Qt本身在不同的时刻发出的。当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
一些事件是在对用户操作做出响应的时候发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
一般来说,使用Qt编程时,我们并不会把主要精力放在事件上,因为在Qt中,需要我们关心的事件总会发出一个信号。
比如,我们关心的是QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。
signal由具体对象发出,然后会马上交给由connect函数连接的slot进行处理;而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,
当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处理。
但是,必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。并且,事件还可以使用“事件过滤器”进行过滤。
总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。
比如,如果我们要自定义一个QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。
Qt设计者的做法是针对不同类型的事件提供不同的事件处理器与之对应,事件和事件处理器中间,桥梁就是QObject::event()函数,
该函数是虚函数,QObject的子类例如QWidget都实现了该函数。该函数的主要功能是进行事件的分发,也就是将不同类型的事件与之相对应的事件处理器相关联,
该函数并不对事件进行处理,真正的事件处理是在事件处理器中进行的。
1: 一种重写event函数,自己写事件函数(需要起名),中间可以事件过滤后再事件处理。
1、event()函数
首先是控制事件分发的event()函数,我们可以改写该函数,改变事件的分发方式,这样就可以改变事件处理的结果。
2、notify()函数
实现该函数可以截获事件,并对事件加以处理,但是该方法很少用,这里不做介绍。
3、事件过滤器
实现自己的事件过滤器就可以改变事件处理的方法和结果,这个方法比较常用。
总结起来就两个步骤:
第一:对目标对象调用installEventFilter()来注册监视对象(事件过滤器);
第二:重写监视对象的eventFilter()函数处理目标对象的事件。
4、事件处理器
事件处理的最后一步,也是最重要的一步就是事件处理器,因为它才是真正进行事件处理的地方,
我们可以改写以有的事件处理器,以此改变已有事件的处理方法和处理结果,
我们也可以定义自己的事件类型和相应的事件处理器。
2:重写控件的事件函数:
当我们自己定义组件的时候,我们就关心事件,因为我们需要通过重写事件的处理函数来设置我们自己定义的组件的功能.
#ifndef EVENTLABEL #define EVENTLABEL #include "QLabel" class EventLabel:public QLabel { Q_OBJECT protected: /**********重写事件响应的虚函数****************/ void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); }; #endif // EVENTLABEL #include "eventlabel.h" #include "QMouseEvent" void EventLabel::mouseMoveEvent(QMouseEvent *event) { this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>") .arg (QString::number(event->x()), QString::number(event->y()))); } void EventLabel::mousePressEvent(QMouseEvent *event) { this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>") .arg (QString::number(event->x()), QString::number(event->y()))); } void EventLabel::mouseReleaseEvent(QMouseEvent *event) { QString msg; msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>", event->x(), event->y()); this->setText(msg); }
相关文章推荐
- QT界面鼠标双击事件相应
- Qt中父子widget的事件传递
- c进程读取按键输入,通过socket传输给qt,qt按键线程接收到后,提交到Qt的事件处理系统中
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt 事件与循环,和QEventLoop
- Qt键盘事件
- Qt事件系统
- Qt事件与常用事件处理、过滤
- 继承QToolButon实现Qt自定义按钮遇到的事件问题
- qt鼠标事件总结
- Qt中事件处理的顺序
- Qt深入浅出(十一)事件处理机制
- 有关Qt事件的接收与忽略的一些理解
- Qt事件循环的一些理解
- Qt中QEvent的accept和ignore函数 事件 (以QLabel事件重载为例)
- qt事件循环(exec)
- Qt-事件处理-鼠标事件
- python3+PyQt5 重新实现QT事件处理程序
- QT基础(二)----鼠标、键盘事件处理机制、信息拦截机制
- Qt QLineEdit QLabel添加clicked事件