Qt 鼠标按下移动释放事件

这篇具有很好参考价值的文章主要介绍了Qt 鼠标按下移动释放事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


QEvent::MouseButtonPress

​ 鼠标按下时,触发该事件,它对应的子类是QMouseEvent

QEvent::MouseMove

​ 鼠标移动时,触发该事件,它对应的子类是QMouseEvent

QEvent::MouseButtonRelease

​ 鼠标释放时,触发该事件,它对应的子类是QMouseEvent

1 通过自定义控件实现

自定义一个标签控件LabelX,让它继承自QLabel,然后重写父类的mousePressEventmouseReleaseEventmouseMoveEvent

代码如下:

// 在LabelX.h 中
#ifndef LABELX_H
#define LABELX_H

#include <QDebug>
#include <QLabel>
#include <QMouseEvent>

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

protected:
    // 重写父类的方法
    void enterEvent(QEnterEvent *event);
    void leaveEvent(QEvent *event);

    // 按下,移动,释放事件
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

signals:
};

#endif  // LABELX_H


// 在LabelX.cpp 中
#include "labelx.h"

LabelX::LabelX(QWidget *parent) : QLabel{parent} {
    // 实现鼠标的跟踪
    this->setMouseTracking(true);  // 默认false
}

static int cnt = 1;

void LabelX::enterEvent(QEnterEvent *event) {
    Q_UNUSED(event);
    // qDebug() << "enterEvent: " << cnt++;
    this->setText(QString("enterEvent: %1").arg(cnt++));
}

void LabelX::leaveEvent(QEvent *event) {
    Q_UNUSED(event);
    // qDebug() << "leaveEvent: " << cnt++;
    this->setText(QString("leaveEvent: %1").arg(cnt++));
}

void LabelX::mousePressEvent(QMouseEvent *event) {
    // qDebug() << "mousePressEvent" << event->button() << event->pos()
    //          << event->globalPosition();
    if (event->button() == Qt::LeftButton) {
        qDebug() << "左键按下:"
                 << "x= " << event->x() << "y= " << event->y();
    }
}

void LabelX::mouseReleaseEvent(QMouseEvent *event) {
    // qDebug() << "mouseReleaseEvent" << event->button() << event->pos()
    //          << event->globalPosition();
    if (event->button() == Qt::LeftButton) {
        qDebug() << "左键释放:"
                 << "x= " << event->x() << "y= " << event->y();
    }
}

void LabelX::mouseMoveEvent(QMouseEvent *event) {
    qDebug() << "mouseMoveEvent" << event->buttons() << event->pos()
             << event->globalPosition();
    if (event->buttons() & Qt::LeftButton) {
        qDebug() << "左键释放:"
                 << "x= " << event->x() << "y= " << event->y();
    }
}

1.1 鼠标跟踪

以上,需要鼠标保持按下的状态下,系统才会调用mouseMoveEvent,实际工作中往往有这么一种需求:

鼠标悬浮在控件上,而不是按下,就触发mouseMoveEvent事件,这怎么实现呢?

答案:设置鼠标跟踪,默认情况下鼠标跟踪是关闭的,需要开启

首先,来到LabelX.cpp中,设置标签使能鼠标跟踪,如下:文章来源地址https://www.toymoban.com/news/detail-814532.html

LabelX::LabelX(QWidget *parent) : QLabel{parent} {
    // 实现鼠标的跟踪
    this->setMouseTracking(true);  // 默认false
}

2 鼠标事件移动标签

// 在press_move_release_widget.h中
#ifndef PRESSMOVERELEASEWIDGET_H
#define PRESSMOVERELEASEWIDGET_H

#include <QDebug>
#include <QEvent>
#include <QLabel>
#include <QMouseEvent>
#include <QVBoxLayout>
#include <QWidget>

#include "labelx.h"

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

private:
    QLabel *lbl;
    QWidget *widget;

    QPoint pressPos;  // 鼠标按下的位置
    QPoint wndPos;    // 标签的位置 (左上角的点 top-left)

protected:
    bool eventFilter(QObject *obj, QEvent *event);

signals:
};

#endif  // PRESSMOVERELEASEWIDGET_H


// 在press_move_release_widget.cpp中
#include "press_move_release_widget.h"

PressMoveReleaseWidget::PressMoveReleaseWidget(QWidget *parent)
    : QWidget{parent} {
    QVBoxLayout *verticalLayout = new QVBoxLayout(this);
    verticalLayout->setSpacing(0);
    verticalLayout->setContentsMargins(0, 0, 0, 0);

    // 添加一个自定义控件
    LabelX *lblx = new LabelX(this);
    lblx->setText("鼠标按下/移动/释放");
    lblx->setFrameShape(QFrame::Box);
    lblx->setFixedHeight(50);
    lblx->setAlignment(Qt::AlignCenter);
    lblx->setStyleSheet(
        "background-color: blue; color: white; font-size: 25px");
    verticalLayout->addWidget(lblx);

    // 添加一个标准控件
    widget = new QWidget(this);
    lbl = new QLabel(widget);
    lbl->setText("");
    lbl->setFrameShape(QFrame::Box);
    lbl->setFixedSize(100, 100);
    lbl->setStyleSheet("background-color: red;");
    verticalLayout->addWidget(widget);

    // 安装事件过滤器
    lbl->installEventFilter(this);
}

bool PressMoveReleaseWidget::eventFilter(QObject *obj, QEvent *event) {
    if (obj != lbl) {
        return QWidget::eventFilter(obj, event);
    }

    if (event->type() == QEvent::MouseButtonPress) {
        qDebug() << "MouseButtonPress";
        // 记录鼠标按下的位置,当前标签的位置
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        pressPos = mouseEvent->globalPos();
        // 标签的位置 (左上角的点 top-left)
        wndPos = lbl->pos();
        qDebug() << wndPos;
    } else if (event->type() == QEvent::MouseMove) {
        qDebug() << "MouseMove";
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        // 标签的位置 + (鼠标当前的位置 - 按下鼠标的位置)
        // 他们两之差就是鼠标移动的距离
        QPoint dstPos = wndPos + (mouseEvent->globalPos() - pressPos);
        lbl->move(dstPos);

        // 超出了最左边
        if (lbl->pos().x() < 0) {
            lbl->move(0, dstPos.y());
        }

        // 超出了最右边
        if (lbl->pos().x() > widget->width() - lbl->width()) {
            lbl->move(widget->width() - lbl->width(), dstPos.y());
        }

        // 超出了最上边
        if (lbl->pos().y() < 0) {
            lbl->move(dstPos.x(), 0);
        }

        // 超出了最下边
        if (lbl->pos().y() > widget->height() - lbl->height()) {
            lbl->move(dstPos.x(), widget->height() - lbl->height());
        }

    } else if (event->type() == QEvent::MouseButtonRelease) {
        qDebug() << "MouseButtonRelease";
    }
}

到了这里,关于Qt 鼠标按下移动释放事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TextBox添加鼠标按下、失去焦点、鼠标移动等事件及重写

    TextBox添加鼠标按下、失去焦点、鼠标移动等事件及重写 方法1: 方法2:    

    2024年02月15日
    浏览(40)
  • Qt窗口设置无边框不能移动,鼠标穿透后不能响应点击事件

      最近在做一个迷你小工具,准备干点不可描述的事情,想要短小强悍,始终在最顶层显示,同时不要自带的关闭按钮和边框,百度一下,发现是需要设置如下两个属性:   那么问题来了,这样的话一运行窗体就在正中间,而且无法拖动,就像这样   哪怕对于我这种

    2024年02月10日
    浏览(61)
  • Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

    通过在通道画面上拾取鼠标按下的坐标,然后鼠标移动,直到松开,根据松开的坐标和按下的坐标,绘制一个矩形区域,作为热点或者需要电子放大的区域,拿到这个坐标区域,用途非常多,可以直接将区域中的画面放大,也可以将该圈起来的区域位置发给设备,由设备设定

    2024年02月03日
    浏览(52)
  • 【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件

    说明 在使用Qt的图形视图框架实现功能时,一般会在其基础上进行自定义功能实现。 如:滚轮对场景的缩放,鼠标拖动场景中的项,以及可以在场景中进行右键操作等。 示例 myitem 为自定义QGraphicsItem,实现了边框、重绘事件、鼠标悬停、按键、右键菜单等功能。 myitem.h myi

    2024年02月04日
    浏览(51)
  • 【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置

    ♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油! 加油! 加油 🎈欢迎评论 💬点赞👍🏻 收藏 📂加关注+! 提针对这个需求,以下是示例脚本代码: ♥️作者

    2024年02月12日
    浏览(44)
  • Qt开发-鼠标事件

    个人认为,事件机制是Qt最难以理解且最为精妙的一部分。事件主要分为两种: 在与用户交互时发生 。比如按下鼠标(mousePressEvent),敲击键盘(keyPressEvent)等。 系统自动发生 ,比如计时器事件(timerEvent)等。 在发生事件时(比如说上面说的按下鼠标),就会产生一个

    2024年02月09日
    浏览(43)
  • VBA高级应用30例应用2:MouseMove鼠标左键按下并移动鼠标事件

    《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家 在实际工作中分发VBA程序,写好的

    2024年04月27日
    浏览(41)
  • Qt 之按钮鼠标 悬浮、按下、松开后的效果

    本文介绍了Qt中的按钮实现响应鼠标悬浮、按下、松开后的效果,在三种状态下,按钮改变不同的背景图片。 方式1:通过修改样式表的方式去实现; 方式2:通过继承QPushButton去实现一个自定义的按钮; 方式3:在主界面中给按钮安装事件过滤器的方式去实现 这里尽量不要有

    2024年02月10日
    浏览(46)
  • Qt编写的小软件:一个模拟按键按下和鼠标(左键)按下的小工具

    最近玩SLG游戏的时候有大量对剧情推进无意义的对话想要跳过的时候只能狂按空格键或者狂点鼠标,还好本人好歹是程序员,于是写了个小工具来处理。 下载地址:Qt编写的模拟鼠标按下和按键按下的小工具-C++文档类资源-CSDN下载 上面的资源包含打包好的程序和代码。 界面

    2024年02月11日
    浏览(48)
  • QT QToolButton在鼠标悬浮以及按下的情况下内容会下沉

    使用样式表可以解决此问题 使用此样式可以取消按下状态的下沉效果 如果鼠标悬浮出现下沉效果 我发现的其中一个原因是:按钮原始状态下无边框,而悬浮状态下有边框。 就可以将原始状态的边框颜色设置为透明,即可取消下沉效果 注意:边框的粗细要一致,因为原始状

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包