自学内容网 自学内容网

QT鼠标事件

QT鼠标事件

1.概述

这篇文章介绍如何使用事件和获取事件的信号

2.创建项目

创建一个widget类型项目,在widget.ui文件中添加一个label控件
在这里插入图片描述

然后在项目名称上右键选择Add new... 添加文件,选择
C++ Class
在这里插入图片描述
自定义类名Mylabel,选择基类Base class,点击完成
在这里插入图片描述

3.重写鼠标进入和离开的事件

查看帮助文档,鼠标进入和离开的事件名称
在这里插入图片描述

mylabel.h重写这两个事件,因为要将mylabel提升为QLabel类型的部件,因此MyLabel类要改成继承QLabel

#ifndef MYLABEL_H
#define MYLABEL_H

//改成QLabel
#include <QLabel>

// 改成初始化QLabel
class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);
    
//    鼠标进入事件
    void enterEvent(QEvent *event);
//    鼠标离开事件
    void leaveEvent(QEvent *);

signals:

};

#endif // MYLABEL_H

mylabel.cpp重写这两个事件的功能

#include "mylabel.h"
#include <QDebug>

MyLabel::MyLabel(QWidget *parent) : QWidget(parent)
{

}

//    鼠标进入事件
void MyLabel::enterEvent(QEvent *event)
{
    qDebug() << "鼠标进入";
}
//    鼠标离开事件
void MyLabel::leaveEvent(QEvent *)
{
    qDebug() << "鼠标离开";
}

widget.ui文件中右键label控件,选择promote to 提升,提升的类名就是创建的MyLabel 类名,基类选择QLabel 然后点击Add 添加 , 点击Promote
在这里插入图片描述
当鼠标进入label和离开label,输出调试信息。
在这里插入图片描述

4.如何使用某个控件提供的事件

现在使用QLabel控件提供的事件做个抛砖引玉,通过讲解如何使用QLabel控件的事件方法,那么套用在其他所有的控件中都是一样的,等于学会了所有控件的事件使用。

我们在项目中添加了一个MyLabel类继承了QLabel类,因此也继承了该类的事件。
第一步查看控件提供了哪些事件
首先通过帮助文档,查看QLabel类提供的事件。该类的Reimplemented Protected Functions 部分就是该类提供的所有事件,其中mouse开头表示是鼠标事件。

注意
这些事件函数都是虚函数,也就是抽象函数,没有实现体。

在这里插入图片描述

第二步选择需要的事件,重写它的功能。
例如将鼠标几个事件全部复制到MyLabel.h 文件中。

#ifndef MYLABEL_H
#define MYLABEL_H

//改成QLabel
#include <QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);

//    鼠标进入事件
    void enterEvent(QEvent *event);
//    鼠标离开事件
    void leaveEvent(QEvent *);
    
    
//    鼠标按下事件
    virtual void mousePressEvent(QMouseEvent *ev);
//    鼠标释放事件
    virtual void mouseReleaseEvent(QMouseEvent *ev);
//    鼠标按下后移动事件
    virtual void mouseMoveEvent(QMouseEvent *ev);
    

signals:

};

#endif // MYLABEL_H

MyLabel.cpp 文件中重写事件功能

#include "mylabel.h"
#include <QDebug>

//改成初始化QLabel
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{

}

//    鼠标进入事件
void MyLabel::enterEvent(QEvent *event)
{
//    qDebug() << "鼠标进入";
}
//    鼠标离开事件
void MyLabel::leaveEvent(QEvent *)
{
//    qDebug() << "鼠标离开";
}

//    鼠标按下事件
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    qDebug() << "鼠标按下了";
}
//    鼠标释放事件
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    qDebug() << "鼠标释放了";
}
//    鼠标按下后移动事件
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
    qDebug() << "鼠标移动了";
}

使用鼠标点击QLabel控件时候,捕捉到了重写的事件。
在这里插入图片描述
上面每个事件都有一个ev参数,下面打印出参数中捕捉到的内容。
如果要想知道每个函数中参数能输出什么内容,还是查看帮助文档。
例如mousePressEvent 函数的参数是QMouseEvent,他也是一个类,查看帮助文档,该类提供的含有返回值类型的函数,就是ev能够提供的内容。
在这里插入图片描述

输出参数中的内容

//    鼠标按下事件
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    QString str = QString("鼠标按下了 x = %1 y=%2").arg(ev->x()).arg(ev->y());
    qDebug() << str;
}

在这里插入图片描述

设置启用鼠标状态追踪,鼠标进入QLabel控件后,不需要按下,只要移动就会输出信息。

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
//    设置鼠标追踪:鼠标不需要按下,只要启动就会追踪
    setMouseTracking(true);

}

原文地址:https://blog.csdn.net/m0_38039437/article/details/143720638

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!