前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt事件

Qt事件

作者头像
zy010101
修改2020-04-16 17:02:19
5310
修改2020-04-16 17:02:19
举报
文章被收录于专栏:程序员程序员

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

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

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

#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的事件如下:

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

实现的效果如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档