14 鼠标事件
代码资源:https://download.csdn.net/download/qq_36926037/85048846
14.1 项目准备
(1)创建项目,详细过程步骤:https://blog.csdn.net/qq_36926037/article/details/123720720
(2)自定义控件创建
14.2 案例1:鼠标进入、离开
思路:假设自定义控件的基类为QLabel类,那么QLabel类中的一些鼠标事件都可以重写/实现,或者QLabel的父类的一些鼠标事件也可以重写实现。
14.2.2 鼠标事件的声明与实现
(1)鼠标事件的声明:打开自定义控件的头文件,进行鼠标(进入、离开)事件的声明
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QWidget>
class myLabel : public QWidget
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
//鼠标进入事件
void enterEvent(QEvent *event);
//鼠标离开事件
void leaveEvent(QEvent *event);
signals:
};
#endif // MYLABEL_H
(2)鼠标事件的实现:打开自定义控件的源文件,进行鼠标(进入、离开)事件的函数实现
#include "mylabel.h"
#include <QDebug>
myLabel::myLabel(QWidget *parent) : QWidget(parent)
{
}
//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{
qDebug()<<"鼠标进入了";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent * )
{
qDebug()<<"鼠标离开了了";
}
14.2.3 自定义控件的使用
(1)将自定义控件的基类改为QLabel类
(2)在主界面中添加自定义控件:普通 QLabel控件提升为自定义控件
(3)自定义控件外观设置:添加边框
(4)效果展示
14.3 案例2:鼠标按下、移动、释放
上述自定义控件继承自QLabel类,因此可以实现QLabel类中包含的鼠标事件(重写QLabel类中的鼠标事件)
14.3.1 鼠标事件的声明与实现
(1)鼠标事件的声明:打开自定义控件的头文件,进行鼠标(点击、移动、释放)事件的声明
#ifndef MYLABEL_H
#define MYLABEL_H
//#include <QWidget>
#include <QLabel>
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
//鼠标进入事件
void enterEvent(QEvent *event);
//鼠标离开事件
void leaveEvent(QEvent * );
//QLabel类中定义的鼠标事件的声明
void mouseMoveEvent(QMouseEvent *ev) ;
void mousePressEvent(QMouseEvent *ev) ;
void mouseReleaseEvent(QMouseEvent *ev);
signals:
};
#endif // MYLABEL_H
(2)鼠标事件的实现:打开自定义控件的源文件,进行鼠标(点击、移动、释放)事件的实现
#include "mylabel.h"
#include <QDebug>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}
//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{
qDebug()<<"鼠标进入了";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent * )
{
qDebug()<<"鼠标离开了了";
}
//QLabel类中定义的鼠标事件的声明
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
//鼠标移动事件
qDebug()<<"鼠标移动";
}
void myLabel::mousePressEvent(QMouseEvent *ev)
{
//鼠标点击事件
qDebug()<<"鼠标按下";
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
//鼠标释放事件
qDebug()<<"鼠标释放";
}
14.3.2 鼠标事件的实现优化(捕捉鼠标相关信息)
捕捉鼠标相关信息的思路:通过QMouseEvent * ev类实现,该类包含多个成员函数,可以获取鼠标的相关信息
(1)捕捉鼠标位置信息:x()、y()
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
//鼠标移动事件 //捕捉鼠标的信息
//(1)鼠标在当前控件的位置
QString str=QString("鼠标按下了x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
//(2)鼠标在全局窗口的位置
QString str2=QString("鼠标按下了x=%1 y=%2").arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str2;
}
(2)捕捉鼠标的按键(左键、右键、滚轮)信息:button()
void myLabel::mousePressEvent(QMouseEvent *ev)
{
//鼠标点击事件
//(1)鼠标左键点击
if(ev->button()==Qt::LeftButton)
{
qDebug()<<"点击左键";
}
//(2)鼠标右键点击
if(ev->button()==Qt::RightButton)
{
qDebug()<<"点击右键";
}
}
(3)鼠标移动状态的按键信息(实现按住鼠标移动的过程中,也能判断是按的鼠标的哪个键):buttons()
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
//鼠标移动事件 //捕捉鼠标的信息
// //(1)鼠标在当前控件的位置
// QString str=QString("鼠标按下了x=%1 y=%2").arg(ev->x()).arg(ev->y());
// qDebug()<<str;
// //(2)鼠标在全局窗口的位置
// QString str2=QString("鼠标按下了x=%1 y=%2").arg(ev->globalX()).arg(ev->globalY());
// qDebug()<<str2;
//(3)鼠标移动与点击状态的绑定
if(ev->buttons() & Qt::LeftButton)
{
QString str3=QString("点击左键并移动x=%1 y=%2的位置").arg(ev->x()).arg(ev->y());
qDebug()<<str3;
}
}
(4)设置鼠标追踪,不用按键也能获取鼠标信息:
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
//设置鼠标的追踪状态
setMouseTracking(true);
}