您的位置:首页 > 编程语言 > Qt开发

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:重写控件的事件函数:

当我们自己定义组件的时候,我们就关心事件,因为我们需要通过重写事件的处理函数来设置我们自己定义的组件的功能.

#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: