Qt事件

2020-04-16 17:02:19 浏览数 (1)

事件是指诸如,移动鼠标,点击按钮,定时器,按下键盘等。他们是由系统或者Qt发出的。所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)。也就是说当我们的界面显示以后,程序就进入了事件循环。程序在等待事件的发生,假设你的界面上可能有3个按钮,那么程序不肯能一个按钮一个按钮的向下执行,他需要等你按下按钮才行。只有你按下了按钮。那么相应的事件才会发生。事件驱动的设计模式改变了以往程序线性执行的方式。

Qt 中的事件和信号槽却并不是可以相互替代的。信号由具体的对象发出,然后会马上交给由connect()函数连接的槽进行处理;而对于事件,Qt 使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部。前一个事件完成后,取出后面的事件进行处理。但是,必要的时候,Qt 的事件也可以不进入事件队列,而是直接处理。信号一旦发出,对应的槽函数一定会被执行。但是,事件则可以使用“事件过滤器”进行过滤,对于有些事件进行额外的处理,另外的事件则不关心。总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个能够响应鼠标事件的EventLabel,我们就需要重写QLabel的鼠标事件,做出我们希望的操作,有可能还得在恰当的时候发出一个类似按钮的clicked()信号(如果我们希望让这个EventLabel能够被其它组件使用)或者其它的信号。

Qt中的事件都继承自QEvent类。下面是一个例子。

代码语言:javascript复制
#include "mylable.h"

MyLable::MyLable(QWidget *parent):QLabel(parent)
{
    
}
void MyLable::mouseMoveEvent(QMouseEvent *event)
{
    this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
                      .arg(QString::number(event->x()), QString::number(event->y())));
}
void MyLable::mousePressEvent(QMouseEvent *event)
{
    this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
                     .arg(QString::number(event->x()), QString::number(event->y())));
}
void MyLable::mouseReleaseEvent(QMouseEvent *event)
{
    QString msg;
        msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                    event->x(), event->y());
        this->setText(msg);
}

这三个函数是QLabel类的虚函数重写。MyLabel继承自QLabel。QLable的事件如下:

所以这三个函数必须叫这个名字。因为我们是重写父类的虚函数。

实现的效果如下:

0 人点赞