在之前的程序中已经使用过事件,例如在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