QT之GUI学习笔记(十四) -----事件(event)

原文地址http://devbean.blog.51cto.com/448512/223974

一.概念

1.事件(event)是由系统或者Qt本身在不同的时刻发出的。当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
2.种类:
(1)对用户操作做出响应的时候发出,如键盘事件等
(2)由系统自动发出,如计时器事件
3.
在使用QT编程时,我们并不会把主要精力放在事件上。
原因:在Qt中,需要我们关心的事件总会发出一个信号。
比如,我们关心的是QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。
4.事件和信号的区别
(1)signal由具体对象发出后,会立刻交给由connect函数连接的slot进行处理;
而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,才能取出后面的事件进行处理。必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。并且,事件还可以使用“事件过滤器”进行过滤。
(2)若使用组件,我们关心的是信号槽;若自定义组件,我们关心的是事件。
原因:我们可以通过事件来改变组件的默认操作。
比如,如果我们要自定义一个QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号.
5.

QMessageBox message(QMessageBox::NoIcon, "Title", "Content with icon."); 
message.setIconPixmap(QPixmap("icon.png")); 
message.exec();

在这段代码中exec函数开始Qt的事件循环。
在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt将创建一个事件对象。
6.
Qt的所有事件都继承于QEvent类。
在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。
event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。

二 代码

在所有组件的父类QWidget中,定义了很多事件处理函数,如keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等。由于这些函数是protected virtual类型的,所以我们需要在子类中重新定义这些函数。
1.main.cpp中的代码替换为下面的代码

#include "mainwindow.h"
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>

class EventLabel : public QLabel
{
//3个protected类型的mouseEvent事件
protected:
        void mouseMoveEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
        void mouseReleaseEvent(QMouseEvent *event);
};
//对mouseMoveEvent的重写,只需要往里面增加代码即可
void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
        this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
                                                        .arg(QString::number(event->x()), QString::number(event->y())));
}
//对mousePressEvent的重写
void EventLabel::mousePressEvent(QMouseEvent *event)
{
        this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
                                                        .arg(QString::number(event->x()), QString::number(event->y())));
}
//对mouseReleaseEvent的重写
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
        QString msg;
        msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                                event->x(), event->y());
        this->setText(msg);
}

int main(int argc, char *argv[])
{
        QApplication app(argc, argv);
        EventLabel *label = new EventLabel;
        label->setWindowTitle("MouseEvent Demo");
        label->resize(300, 200);
        label->show();
        return app.exec();
}

2.运行结果如下
鼠标移动过程运行截图
这里写图片描述
鼠标点击
鼠标释放
也会出现相应的提示

三 知识点解析

上面的代码中 EventLabel继承了QLabel类,重写了mousePressEvent、mouseMoveEvent和MouseReleaseEvent三个函数。
代码实现的功能:只在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)时把坐标显示在这个Label上面。
3.代码片段对比

this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
                                                        .arg(QString::number(event->x()), QString::number(event->y())));
QString msg;
msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                        event->x(), event->y());
this->setText(msg);

这两段代码实现的功能都是相同的。
第一个代码片段使用了arg来代替参数;第二个代码片段使用了sprintf函数用于设置msg的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值