在写鼠标事件之前,我们先按(8)的方法造一个mylabel控件,并把它应用在主窗口
【为了方便看,我给这个label加了黑框,修改位置在这里】
然后就可以开始写鼠标事件了
遇事不决,先查文档
可以看到,qt提供了鼠标事件的五种操作,分别是移动,摁压,释放(图1),进入(图2),和离开(图3)
而且,这是一种虚函数——这就说明,我们要自己实现它。
先在mylabel的头文件里面写声明
//mylabel.h
public:
explicit mylabel(QWidget *parent = nullptr);
//鼠标进入事件
void enterEvent(QEvent *event);
//鼠标离开事件
void leaveEvent(QEvent *event);
//鼠标摁压事件
void mousePressEvent(QMouseEvent *ev);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *ev);
然后,在cpp文件中实现
以进入为例
//mylabel.cpp
//鼠标进入事件
void mylabel::enterEvent(QEvent *event)
{
qDebug() << "进入";
}
当然,也可以做一些特殊设定,比如左键摁压才打印
//mylabel.cpp
//鼠标摁压事件
void mylabel::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
QString str = QString("鼠标坐标 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
}
查一下文档,属于鼠标的枚举有三个,leftbutton,rightbutton和midbutton对应左右中
这里用了qt的链式字符输入,类似于format(),需要填充的地方写%数字,后面以.连接要添加的字符
通过查询帮助文档,我们可以知道,QMouseEvent是有两个坐标参量的,一个是在控件里的坐标x,y。另一个是在全屏幕(不是父窗口)的globalx,globaly
这里用的就是后者
【可以用这个看一下自己电脑屏幕有多大】
有一个地方需要注意,就是移动是不能这么直接判断的,要这样
//mylabel.cpp
//鼠标移动事件
void mylabel::mouseMoveEvent(QMouseEvent *ev)
{
if(ev->buttons() & Qt::LeftButton)
{
qDebug() << "移动";
}
}
因为移动是个持续状态,要用位处理符来判断是否有一起移动的情况
最后,我们学习一个跟踪函数,可以写在mylabel的主窗体里
//mylabel.cpp
mylabel::mylabel(QWidget *parent) : QLabel(parent)
{
//设置鼠标追踪
setMouseTracking(true);
}
这个参数默认为false,如果设置了,在移动事件里不用点击也可以判定移动,非常方便。