参考视频: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 的,也就是说,我们可以在子类中重新实现这些函数。
测试说明:创建一个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
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 }
上述代码中使用了QWidge的mouseTracking属性,该属性用于设置是否追踪鼠标。只有鼠标被追踪时,mouseMoveEvent()才会发出。如果mouseTracking是 false(默认即是),组件在至少一次鼠标点击之后,才能够被追踪,也就是能够发出mouseMoveEvent()事件。如果mouseTracking为 true,则mouseMoveEvent()直接可以被发出。
将ui中的label提升为我们自定义的label。运行进行测试:
原文:https://www.cnblogs.com/mrlayfolk/p/13222382.html