一、鼠标捕获事件
想要一个QLabel,可以捕获鼠标事件
如果不需要ui设置,仅仅只需要鼠标捕获,直接创建一个新的类c++ Class即可
基类选择QLabel的父类就行了
查阅文档可以知道,QWidget下有一个鼠标进入Wiget就可以触发的事件
直接复制过来就行了(因为是虚函数,要重写,注意要去掉作用域和virtual)
(QEnterEvent是QEvent的基类) (.h中2个地方改继承,.cpp中一个地方改继承)
在mylabel.h中定义事件
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>//增加QLabel
class myLabel : public QLabel//修改继承为QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
//鼠标进入事件
void enterEvent(QEnterEvent *event);
//鼠标离开事件
void leaveEvent(QEvent *event);
signals:
};
#endif // MYLABEL_H
在mylabel.cpp中实现
#include "mylabel.h"
#include<QDebug>
myLabel::myLabel(QWidget *parent)
: QLabel{parent}
{
}
//鼠标进入事件
void myLabel::enterEvent(QEnterEvent *event){
qDebug()<<"the mouse entered";
};
//鼠标离开事件
void myLabel::leaveEvent(QEvent *event){
qDebug()<<"the mouse left";
};
然后在widget.ui中创建一个label,提升为myLabel
二、鼠标的按下、释放、移动
在文档中搜索QLabel,还能找到很多可以重新实现的事件
mylabel.h中
//鼠标按下
void mousePressEvent(QMouseEvent *ev);
//鼠标释放
void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动
void mouseMoveEvent(QMouseEvent *ev);
mylabel.cpp中
//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev){
//当鼠标左键按下
if(ev->button()==Qt::LeftButton){
QString str = QString("the mouse pressed x=%1 y=%2 globalX=%3 globalY=%4")
.arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());//(可以文档搜索arg用法,链式编程)
qDebug()<<str;
}
};
//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev){
//鼠标点击和释放是一种瞬时状态,用button(文档中button:Returns the button that caused the event)
if(ev->button()==Qt::LeftButton){
QString str = QString("the mouse released x=%1 y=%2 globalX=%3 globalY=%4")
.arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());
qDebug()<<str;
}
};
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev){
//由于鼠标移动是一种状态,因此要用buttons,只是其中包含了左键按下这个状态。因此要用&。(文档中Returns the button state when the event was generated. The button state is a combination )
if(ev->buttons()&Qt::LeftButton){
QString str = QString("the mouse moved x=%1 y=%2 globalX=%3 globalY=%4")
.arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());
qDebug()<<str;
}
};
三、设置鼠标追踪状态
If mouse tracking is enabled, the widget receives mouse move events even if no buttons are pressed.
设置鼠标追踪状态为true,即使是没有任何按键按下,都可以触发move events(注意,之前的程序中,move事件中把点击左键的限制给去掉)
myLabel::myLabel(QWidget *parent)
: QLabel{parent}
{
//设置鼠标追踪状态
setMouseTracking(true);
}
四、鼠标事件:总结
注意ev->x()这种已经不用了
用
ev->pos().x()
ev->pos().y()
ev-> globalPosition().x()
ev->globalPosition().y()