和上一个案例相同,也是做了提升,换了相同父类,但是方式有所不同
先在widget.ui中加入label标签,此时其父类为QLabel,然后想实现鼠标在QLabel上的捕获。所以我们需要把QLabel提升为自己的框架,然后自定义框架后,我们就可以自己捕获信息了。然后添加新文件mylabel.h和mylabel.cpp,base class选择继承为QWidget,因为选项没有QlABEL,一会在文件中将函数修改即可。
#ifndef MYLABLE_H
#define MYLABLE_H
#include <QLabel>
class MyLable : public QLabel
{
Q_OBJECT
public:
explicit MyLable(QWidget *parent = nullptr);
//鼠标进入 声明
void enterEvent(QEvent *);
//鼠标离开
void leaveEvent(QEvent *);
//鼠标按下事件
void mousePressEvent(QMouseEvent *ev);
//鼠标离开事件
void mouseReleaseEvent(QMouseEvent *ev) ;
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *ev) ;
signals:
};
#endif // MYLABLE_H
#include "mylable.h"
#include "QDebug"
#include "QMouseEvent"
MyLable::MyLable(QWidget *parent) : QLabel(parent)
{
//设置鼠标追踪
this->setMouseTracking(true);//默认为false这里设置为true
}
//两个父类一样才能提升
//此时提升了widget.ui父类为mylable 此时就可以把widget.ui当为mylable进行代码添加使用
//鼠标进入
void MyLable::enterEvent(QEvent *)//加上作用域
{
// qDebug()<<"鼠标进入了";
}
//鼠标离开
void MyLable::leaveEvent(QEvent *)
{
// qDebug()<<"鼠标离开了";
}
//鼠标按下事件
void MyLable::mousePressEvent(QMouseEvent *ev)
{
//如果是鼠标左键按下,才打印下面的信息
if(ev->button()==Qt::LeftButton)
{
QString str=QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());//QString函数
qDebug()<<str;
}
}
//鼠标离开事件
void MyLable::mouseReleaseEvent(QMouseEvent *ev)
{
if(ev->button()==Qt::LeftButton){
QString str=QString("鼠标释放了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;//
}
}
//鼠标移动事件
void MyLable::mouseMoveEvent(QMouseEvent *ev)
{
//移动不是一瞬间的,是一段时间的
// if(ev->buttons() & Qt::LeftButton)//用了复合按键和未与按键
// {
QString str=QString("鼠标移动了,x=%1,y=%2").arg(ev->x()).arg(ev->y());//QString函数
qDebug()<<str;//要长按
// }
}//坐标系是基于坐标系的
实现了鼠标进入label框后就会qDebug出在移动,包括点击和离开都会有响应。
代码精讲
//鼠标按下事件 void MyLable::mousePressEvent(QMouseEvent *ev) { //如果是鼠标左键按下,才打印下面的信息 if(ev->button()==Qt::LeftButton) { QString str=QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());//QString函数qDebug()<<str; }}两个红色代码? 第一个是按下左键才会实现效果? ? 第二个是会显示在QLable的坐标,它是以左上角为(0,0)基础坐标,经过实现,可以一直出去,坐标可以为负
//在构造函数中的设置 MyLable::MyLable(QWidget *parent) : QLabel(parent){ //设置鼠标追踪 this->setMouseTracking(true);//默认为false这里设置为true}
默认为false这里设置为true
效果图如下?
?