【QT】鼠标常用事件

新建项目

加标签控件

当鼠标进去,显示【鼠标进入】,离开时显示【鼠标离开】

将QLable提升成自己的控件,然后再去捕获

添加文件

改继承的类名

提升类

同一个父类,可以提升

效果

现在代码就和Qlabel对应起来了。

在.h中声明,.cpp中实现

cpp 复制代码
#include "mylabel.h"
#include <QDebug>

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

}


// 鼠标进入
void MyLabel::enterEvent(QEvent* ) {
    qDebug() << "鼠标进入";
}


// 鼠标离开
void MyLabel::leaveEvent(QEvent* ) {
    qDebug() << "鼠标离开";
}

测试

鼠标的移动、按下、松开事件

cpp 复制代码
    // 鼠标移动事件
    virtual void mouseMoveEvent(QMouseEvent *ev) override;
    // 鼠标按下事件
    virtual void mousePressEvent(QMouseEvent *ev) override;
    // 鼠标松开事件
    virtual void mouseReleaseEvent(QMouseEvent *ev) override;

实现

cpp 复制代码
#include "mylabel.h"
#include <QDebug>

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

}


// 鼠标进入
void MyLabel::enterEvent(QEvent* ) {
    qDebug() << "鼠标进入";
}


// 鼠标离开
void MyLabel::leaveEvent(QEvent* ) {
    qDebug() << "鼠标离开";
}


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

测试

坐标信息(基于控件的坐标系

cpp 复制代码
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

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

}


// 鼠标进入
void MyLabel::enterEvent(QEvent* ) {
    qDebug() << "鼠标进入";
}


// 鼠标离开
void MyLabel::leaveEvent(QEvent* ) {
    qDebug() << "鼠标离开";
}


// 鼠标移动事件
void MyLabel::mouseMoveEvent(QMouseEvent *ev) {
    qDebug() << "鼠标移动" ;
}
// 鼠标按下事件
void MyLabel::mousePressEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    QString str = QString("鼠标按下, x = %1, y = %2").arg(ev->x()).arg(ev->y());
    qDebug() << str;
}
// 鼠标松开事件
void MyLabel::mouseReleaseEvent(QMouseEvent *ev) {
    qDebug() << "鼠标松开";
}

效果

其他的类似

判断鼠标左右键

cpp 复制代码
// 鼠标按下事件
void MyLabel::mousePressEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    // 左键才打印下面的信息
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标按下, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    } else {
        qDebug() << "右键按下";
    }

}

效果

全部改成按左键有输出

cpp 复制代码
// 鼠标移动事件
void MyLabel::mouseMoveEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标移动, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    }
}
// 鼠标按下事件
void MyLabel::mousePressEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    // 左键才打印下面的信息
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标按下, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    }

}
// 鼠标松开事件
void MyLabel::mouseReleaseEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标松开, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    }
}

效果

移动是没有输出的。按下和松开是一瞬间的,而移动不是一瞬间的,是联合的。使用buttons和&

cpp 复制代码
// 鼠标移动事件
void MyLabel::mouseMoveEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    if (ev->buttons() & Qt::LeftButton) {
        QString str = QString("鼠标移动, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    }
}

效果

鼠标不点下去,移动。设置鼠标追踪的状态,默认为false,在构造函数中设置

cpp 复制代码
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    // 设置鼠标追踪状态,默认是false
    this->setMouseTracking(true);
}


// 鼠标进入
void MyLabel::enterEvent(QEvent* ) {
    qDebug() << "鼠标进入";
}


// 鼠标离开
void MyLabel::leaveEvent(QEvent* ) {
    qDebug() << "鼠标离开";
}


// 鼠标移动事件
void MyLabel::mouseMoveEvent(QMouseEvent *ev) {
    // 格式化字符串方式
//    if (ev->buttons() & Qt::LeftButton) {
//        QString str = QString("鼠标移动, x = %1, y = %2").arg(ev->x()).arg(ev->y());
//        qDebug() << str;
//    }


        QString str = QString("鼠标移动, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;

}
// 鼠标按下事件
void MyLabel::mousePressEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    // 左键才打印下面的信息
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标按下, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    }

}
// 鼠标松开事件
void MyLabel::mouseReleaseEvent(QMouseEvent *ev) {
    // 格式化字符串方式
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标松开, x = %1, y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    }
}

效果

相关推荐
「QT(C++)开发工程师」16 小时前
VTK开源视觉库 | 行业应用第一篇
linux·qt·物联网·计算机视觉·信息可视化·vtk
weixin_4672092819 小时前
Qt Creator打开项目提示no valid settings file could be found
开发语言·qt
合作小小程序员小小店20 小时前
舆情,情感微博系统demo,基于python+qt+nlp,开发语言python,界面库qt,无数据库版,数据来自第三方网站获取,
开发语言·pytorch·qt·自然语言处理·nlp
Larry_Yanan21 小时前
QML学习笔记(四十八)QML与C++交互:QML中可实例化C++对象
c++·笔记·qt·学习·ui·交互
伐尘1 天前
【Qt】实现单例程序,禁止程序多开的几种方式
qt
2501_938780281 天前
《轨道交通检测系统中 Qt 与数据库交互的优化方案》
数据库·qt·交互
非得登录才能看吗?1 天前
Qt 外观之Qt样式表(QSS)
qt
LNN20221 天前
Qt creator +Valgrind检测内存泄漏(linux)
linux·开发语言·qt
奔跑吧 android2 天前
【Docker】【03.使用docker搭建ubuntu20.04 Qt5.12 开发环境】
qt·docker·ubuntu20.04·qt5.12
扶尔魔ocy2 天前
【QT常用技术讲解】可拖拽文件的Widget--QListWidget
开发语言·qt