Qt 鼠标按下移动释放事件

文章目录

  • 1 通过自定义控件实现
    • 1.1 鼠标跟踪
  • 2 鼠标事件移动标签

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中,设置标签使能鼠标跟踪,如下:

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";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《解锁R统计分析:深度探索R Commander图形界面》

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在数据科学与大数据技术的浪潮中&#xff0c;R…

基于Java的学生宿舍门禁信息管理系统的设计与实现(源码+lw+部署文档+讲解等

目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的 系统功能测试 系统测试结论 代码参考 数据库代码参考 源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、…

Cesium 常见配置

文章目录 常见配置1. 修改天空背景(skyBox)2. 去除版权信息3. 增加太阳光照效果4. 实现昼夜联动效果5. 显示帧数6. 增加太阳光照7. 大气层显示8. 开启地形深度检测9. 禁止相机进入地下10. 右键拖拽场景倾斜11. 关闭抗锯齿12. 鼠标操作惯性控制13. 自动调整分辨率14. 默认定位到…

记录:云计算学习日常之shell

一、初识shell 文件描述符与输出重定向&#xff1a; 在shell程式中&#xff0c;最常使用的FD(filedescriptor)有三个&#xff0c;分别是&#xff1a; 0&#xff1a;Standard Input(STDIN) 1&#xff1a;Standard Output(STDOUT) 2&#xff1a;Standard Error Output(STDER…

Linux 常见性能指标 -- 网络

本系列记录操作系统常见性能指标&#xff0c;写这个主要是记录也是回顾&#xff0c;笔记很长&#xff0c;拆分了几个部分&#xff0c;本篇记录 网络 的性能指标 日常最常见的问题就是 ping 能不能通&#xff0c;telnet 端口通不通&#xff0c;来判断网络是否正常。但是有些时候…

【数据结构】数据结构初识

前言&#xff1a; 数据结构是计算存储&#xff0c;组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 Data Structure Vi…

H.264数据解析

什么是H.264 H264 是 MPEG-4 标准所定义的最新编码格式&#xff0c;同时也是技术含量最高、代表最新技术水平的视频编码格式之一&#xff0c;标准写法应该是H.264 H264 视频格式是经过有损压缩的&#xff0c;但在技术上尽可能做的降低存储体积下获得较好图像质量和低带宽图像…

劳特巴赫的基础使用(二)

一、基本介绍 LAUTERBACH是世界领先的微处理器开发工具厂商&#xff0c;成立于1979年&#xff0c;总部位于德国慕尼黑。 JTAG Debugger由PowerDebug和Debug Cable组成。PowerDebug是通用控制模块&#xff0c;支持所有Cable&#xff0c;没有License。Debug Cable绑定License&a…

26、江科大stm32视频学习笔记——I2C读写W25Q64

一、W25Q64简介 1、W25Q64的内存空间结构: 一页256字节&#xff0c;4K(4096 字节)为一个扇区&#xff0c;16个扇区为1块&#xff0c;容量为8M字节&#xff0c;共有128个块&#xff0c;2048 个扇区。 2、W25Q64每页大小由256字节组成&#xff0c;每页的256字节用一次页编程指…

笔记:C++/C编程学习:使用nuget管理c++库的原理

如果要做一个应用程序&#xff0c;我们往往会用到很多第三方库&#xff0c;这时库包管理工具就很重要&#xff0c;如js/npm&#xff0c;c#/nuget&#xff0c;php/composer&#xff0c;jave/maven之类&#xff0c;但vc一直没一个很舒服的包管理工具。很多c第三方库对vc都非常不友…

保姆级:Palworld幻兽帕鲁32人服务器一键部署

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

OpenSSL创建生成CA证书、服务器、客户端证书及密钥

OpenSSL创建生成CA证书、服务器、客户端证书及密钥 证数各参数含义生成CA证书创建root证书私钥创建请求证书创建自签署证书 生成服务器证书创建服务器证书创建服务器请求证书使用CA证书签署服务器证书 生成客户端证书创建客户端证书创建客户端请求证书使用CA证书签署客户端证书…

【模拟通信】AM、FM等的调制解调

调制相关的概念 调制&#xff1a;控制载波的参数&#xff0c;使载波参数随调制信号的规律变化 已调信号&#xff1a;受调载波&#xff0c;含有调制信号的全部特征 调制的作用: 提高发射效率多路复用&#xff0c;提高信道利用率提高系统抗干扰能力 两种调制方式 线性调制&a…

​第20课 在Android Native开发中加入新的C++类

​这节课我们开始利用ffmpeg和opencv在Android环境下来实现一个rtmp播放器&#xff0c;与第2课在PC端实现播放器的思路类似&#xff0c;只不过在处理音视频显示和播放的细节略有不同。 1.压缩备份上节课工程文件夹并修改工程文件夹为demo20&#xff0c;将demo20导入到Eclipse或…

搭建k8s集群实战(二)安装keepalived和haproxy

keepalived介绍: 是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障 Keepalived作用: 为haproxy提供vip(10.208.1.190)在三个haproxy实例之间提供主备,降低当其中一个haproxy失效的时对服务的影响。 1、yum安装Keepalived【三个master…

RBD —— 简介

目录 General workflow Tips RBD SOP inputs and outputs Clustering Importing a fractured object into DOPs RBD SOP support nodes Related SOPs Low-level SOPs 通常在刚体模拟中&#xff0c;希望实体对象会因某些碰撞或力而破碎&#xff1b;Houdini内大多数破碎…

C# Bitmap类学习1

Bitmap对象封装了GDI中的一个位图&#xff0c;此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using …

教你如何低成本自建「幻兽帕鲁」服务器,快速一键部署

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

EF core连接数据库的前期完整配置流程-开发环境搭建

EF core连接数据库完整流程-开发环境搭建 前置&#xff1a;.net6 core webapi不勾选任何配置 声明&#xff1a;这里是以两个配置类来做的&#xff0c;一个T_Books表&#xff0c;一个T_Person表 Book&#xff1a;创建属性及类型 BookConfig&#xff1a;对创建的进行属性数据表…

66.Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

原理 首先MyBatis的Mapper接口核心是JDK动态代理 Spring会排除接口&#xff0c;无法注册到IOC容器中 MyBatis 实现了BeanDefinitionRegistryPostProcessor 可以动态注册BeanDefinition 需要自定义扫描器&#xff08;继承Spring内部扫描器ClassPathBeanDefinitionScanner ) 重…