在之前的程序中已经使用过事件,例如在Qt程序的main()函数中创建一个应用对象QApplication,然后调用它的exec()函数,该exec()函数就是开始Qt的事件循环,在执行exec()函数之后,程序就会进入事件循环来监听应用程序的事件。当事件发生时,Qt将创建一个事件对象,Qt中所有事件都继承于QEvent,在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是根据事件对象的类型分派给特定的事件处理函数(Event handler)。
事件处理函数为protected类型,为虚函数,举例:
新建工程,基类为widget,在ui界面中添加label标签:
之后在工程界面添加类文件,由于是添加Label的槽函数,而文件基类中没有Label基类,所以新建的文件基类选为QWidget,之后在生成的mylabel.h与myabel.cpp文件中将基类改为QLabel,.h与.cpp文件如图所示:
#ifndef MYLABEL_H #define MYLABEL_H #include <QLabel> class MyLabel : public QLabel { Q_OBJECT public: explicit MyLabel(QWidget *parent = 0); protected: //鼠标按下事件 void mousePressEvent(QMouseEvent *ev); //鼠标释放事件 void mouseReleaseEvent(QMouseEvent *ev); //鼠标移动事件 void mouseMoveEvent(QMouseEvent *ev); //鼠标进入窗口区域事件 void enterEvent(QEvent *); //鼠标离开窗口区域事件 void leaveEvent(QEvent *); signals: public slots: }; #endif // MYLABEL_H
mylabel.cpp文件为:
#include "mylabel.h" #include<QMouseEvent> #include<QDebug> MyLabel::MyLabel(QWidget *parent) : QLabel(parent) { } //鼠标按下 void MyLabel::mousePressEvent(QMouseEvent *ev) { int i=ev->x(); int j=ev->y(); //打印 if(ev->button() == Qt::LeftButton) { qDebug() << "left"; } else if(ev->button() == Qt::RightButton) { qDebug() << "right"; } else if(ev->button() == Qt::MidButton) { qDebug() << "mid"; } QString text=QString("<center><h1>Mouse Press:(%1,%2)</h1></center>").arg(i).arg(j); this->setText(text); } //鼠标释放 void MyLabel::mouseReleaseEvent(QMouseEvent *ev) { QString text = QString("<center><h1>Mouse Release: (%1, %2)</h1></center>") .arg( ev->x() ).arg( ev->y() ); this->setText(text); } //鼠标移动 void MyLabel::mouseMoveEvent(QMouseEvent *ev) { QString text = QString("<center><h2>Mouse move: (%1, %2)</h2></center>") .arg( ev->x() ).arg( ev->y() ); this->setText(text); } void MyLabel::enterEvent(QEvent *ev) { QString text = QString("<center><h1>Mouse enter</h1></center>"); this->setText(text); } void MyLabel::leaveEvent(QEvent *ev) { QString text = QString("<center><h1>Mouse leave</h1></center>"); this->setText(text); }
为了使得鼠标在初始时即被跟踪,可以在mylabel.cpp的主函数main函数中添加:
MyLabel::MyLabel(QWidget *parent) : QLabel(parent) { //设置追踪鼠标 this->setMouseTracking(true); }
之后在ui界面中选择label,将其进行提升,即可看到鼠标在移动、按下....的变化。
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); protected: //按键按下事件 void keyPressEvent(QKeyEvent *event); //鼠标点击事件 void mousePressEvent(QMouseEvent *); private: Ui::Widget *ui; }; #endif // WIDGET_H
在文件中新加protect类型的函数,虚函数的名字和参数由系统规定。之后在.cpp文件中定义函数
来源:https://www.cnblogs.com/luxinshuo/p/12231775.html