首页 > 其他 > 详细

Qt事件

时间:2020-07-02 09:32:24      阅读:55      评论:0      收藏:0      [点我收藏+]

1  简介

参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=31

参考资料:《Qt教程.docx》

(1)事件(event)

事件由系统或Qt本身在不同时刻发生的,例如按下鼠标、敲下键盘。

Qt程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始Qt的事件循环,在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。但事件发生时,Qt将创建一

个事件对象,Qt中所有事件类都继承QEvent。在事件对象创建完毕后,将这个事件对象传递给QObject的event函数。

event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。

(2)事件处理函数

在所有组件的父类QWidget中,定义了很多事件处理的回调函数,这些函数都是 protected virtual 的,也就是说,我们可以在子类中重新实现这些函数。

技术分享图片    技术分享图片

2  测试

测试说明:创建一个QLabel,用于显示鼠标按下、释放、移动时的坐标,主要是为了测试鼠标按下、释放、移动这三个事件。

创建一个带ui的QWidget工程:

技术分享图片

其中,mylabel是自定义的label,我们重写其鼠标事件:

mylabel.h中的代码如下:

技术分享图片
 1 #ifndef MYLABEL_H
 2 #define MYLABEL_H
 3 
 4 #include <QWidget>
 5 #include <QLabel>
 6 
 7 class mylabel : public QLabel
 8 {
 9     Q_OBJECT
10 public:
11     explicit mylabel(QWidget *parent = nullptr);
12 
13 protected:
14     //事件处理函数
15     void mousePressEvent(QMouseEvent *ev);
16     void mouseReleaseEvent(QMouseEvent *ev);
17     void mouseMoveEvent(QMouseEvent *ev);
18 
19 signals:
20 
21 public slots:
22 };
23 
24 #endif // MYLABEL_H
View Code

mylabel.cpp中的代码如下:

技术分享图片
 1 #include "mylabel.h"
 2 #include <QMouseEvent>
 3 #include <QString>
 4 
 5 mylabel::mylabel(QWidget *parent) : QLabel(parent)
 6 {
 7     this->setMouseTracking(true);
 8 }
 9 
10 void mylabel::mousePressEvent(QMouseEvent *ev)
11 {
12     QString text = QString("<center><h1>Mouse press:: (%1, %2)</h1></center>").arg(ev->x()).arg(ev->y());
13     this->setText(text);
14 }
15 
16 void mylabel::mouseReleaseEvent(QMouseEvent *ev)
17 {
18     QString text = QString("<center><h1>Mouse release:: (%1, %2)</h1></center>").arg(ev->x()).arg(ev->y());
19     this->setText(text);
20 }
21 
22 void mylabel::mouseMoveEvent(QMouseEvent *ev)
23 {
24     QString text = QString("<center><h1>Mouse move:: (%1, %2)</h1></center>").arg(ev->x()).arg(ev->y());
25     this->setText(text);
26 }
View Code

上述代码中使用了QWidge的mouseTracking属性,该属性用于设置是否追踪鼠标。只有鼠标被追踪时,mouseMoveEvent()才会发出。如果mouseTracking false(默认即是),组件在至少一次鼠标点击之后,才能够被追踪,也就是能够发出mouseMoveEvent()事件。如果mouseTracking true,则mouseMoveEvent()直接可以被发出。

将ui中的label提升为我们自定义的label。运行进行测试:

技术分享图片

 

Qt事件

原文:https://www.cnblogs.com/mrlayfolk/p/13222382.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!