一、鼠标捕获事件
想要一个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()