VS2022联合Qt5开发学习9(QT5.12.3鼠标按下、释放、移动事件以及Qt上取标注点)

在研究医学图像可视化的时候,鼠标响应这里一直都有问题。研究了几天VTK的取点,还是会和Qt冲突。所以现在试试Qt的方式取点,看看能不能实现我的功能。

查了很多资料,这篇博文里的实例有部分参考了祥知道-CSDN博客这位博主的博客[QT]获取鼠标坐标以及按键响应-CSDN博客。他的界面很清晰明了,所以我做ui界面就参考了他的结构。这篇博文主要介绍了如何利用鼠标按下事件、鼠标释放事件实现自己的功能需求以及如何获取鼠标移动的坐标变换。

1. 鼠标按下事件、鼠标释放事件

步骤一:新建一个Qt项目,按照下图绘制ui界面。

步骤二:首先加入头文件:

#include <QMouseEvent>

在.h和.cpp文件中加入鼠标按下、释放事件的相关函数:

在之前的博客VS2022联合Qt5开发学习6(ui嵌入另一个ui、主界面与子界面传递信号、为Qt控件添加背景图片)_vs2022使用qt新加一个.ui界面-CSDN博客里,我介绍了Qt按钮Style的设置,这里正好用上,用于区分鼠标按下和释放事件触发时显示按钮的变化。

	QString style_active = "border:2px solid black;background:green";QString style_release = "border:2px solid black;";

鼠标状态:

枚举鼠标的状态:

enum MouseState //鼠标状态
{L_C,//left clickR_C,M_C,L_DC,//left double clickR_DC,Wheel,//wheel moveRelease
};

 设置控件初始状态:

void mousePoint::setMouseUIdefault()
{QString style_release = "border:2px solid black;";ui.lab_mR_D->setStyleSheet(style_release);ui.lab_mR->setStyleSheet(style_release);ui.lab_mL_D->setStyleSheet(style_release);ui.lab_mL->setStyleSheet(style_release);ui.lab_mM->setStyleSheet(style_release);ui.lab_mM_up->setStyleSheet(style_release);ui.lab_mM_down->setStyleSheet(style_release);
}

鼠标按键变化引起ui界面控件发生变化: 

void mousePoint::setMouseState(MouseState ms, int wheelVal)
{QString style_active = "border:2px solid black;background:green";QString style_release = "border:2px solid black;";setMouseUIdefault();switch (ms){case L_C:ui.lab_mL->setStyleSheet(style_active);break;case R_C:ui.lab_mR->setStyleSheet(style_active);break;case M_C:ui.lab_mM->setStyleSheet(style_active);break;case L_DC:ui.lab_mL_D->setStyleSheet(style_active);break;case R_DC:ui.lab_mR_D->setStyleSheet(style_active);break;case Wheel:ui.lab_mM_val->setText(QString("%1").arg(wheelVal));if (wheelVal > 0){// 放大ui.lab_mM_up->setStyleSheet(style_active);ui.lab_mM_down->setStyleSheet(style_release);}else{// 缩小ui.lab_mM_up->setStyleSheet(style_release);ui.lab_mM_down->setStyleSheet(style_active);}break;case Release://setMouseUIdefault();break;}
}

鼠标按下:
void mousePoint::mousePressEvent(QMouseEvent* event)
{//单击// 如果是鼠标左键按下if (event->button() == Qt::LeftButton) {//qDebug() << "left click";setMouseState(MouseState::L_C, 0);}// 如果是鼠标右键按下else if (event->button() == Qt::RightButton) {//qDebug() << "right click";setMouseState(MouseState::R_C, 0);}else if (event->button() == Qt::MidButton) {//qDebug() << "mid click";setMouseState(MouseState::M_C, 0);}}

鼠标释放:
void mousePoint::mouseReleaseEvent(QMouseEvent* event)
{//释放setMouseState(MouseState::Release, 0);
}

鼠标双击:
void mousePoint::mouseDoubleClickEvent(QMouseEvent* event)
{//双击// 如果是鼠标左键按下if (event->button() == Qt::LeftButton) {//qDebug() << "left double click";setMouseState(MouseState::L_DC, 0);}else if (event->button() == Qt::RightButton) {//qDebug() << "right double click";setMouseState(MouseState::R_DC, 0);}
}

滚轮操作:
void mousePoint::wheelEvent(QWheelEvent* event)
{//滚轮int wheel_val = event->delta();setMouseState(MouseState::Wheel, wheel_val);
}

运行结果:

鼠标响应界面

2. 制作跟随鼠标移动的圆

这个项目就接着上面那个实例接着做吧。

步骤一:加上头文件

#include <QPaintEvent>
#include <QPainter>

步骤二: 在.h和.cpp文件中加入鼠标移动、绘制圆并实时更新的相关函数:

绘制函数:
void mousePoint::paintEvent(QPaintEvent* event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);//反走样QFont font;painter.save();//保存旧的painterfont = painter.font();font.setPointSize(12);painter.setFont(font);painter.setBrush(QBrush(QColor(200, 200, 100)));painter.drawEllipse(fastPoint, r, r);//原点为fastPoint,半径为30painter.restore();//回到旧的painter
}

鼠标移动:
void mousePoint::mouseMoveEvent(QMouseEvent* event)
{if (pushButton){fastPoint = event->pos();update();//画出更新位置}
}

鼠标按下和释放:
void mousePoint::mousePressEvent(QMouseEvent* event)
{//单击// 如果是鼠标左键按下if (event->button() == Qt::LeftButton) {//qDebug() << "left click";setMouseState(MouseState::L_C, 0);}// 如果是鼠标右键按下else if (event->button() == Qt::RightButton) {//qDebug() << "right click";setMouseState(MouseState::R_C, 0);}else if (event->button() == Qt::MidButton) {//qDebug() << "mid click";setMouseState(MouseState::M_C, 0);}QPoint p = event->pos();if (event->button() == Qt::LeftButton && p.x() > fastPoint.x() - r / 2 &&p.x() < fastPoint.x() + r / 2 && p.y() > fastPoint.y() - r / 2&& p.y() < fastPoint.y() + r / 2)pushButton = true;}void mousePoint::mouseReleaseEvent(QMouseEvent* event)
{//释放setMouseState(MouseState::Release, 0);if (event->button() == Qt::LeftButton)pushButton = false;
}

运行结果:

制作跟随鼠标移动的圆

3. 获取鼠标坐标

懒得开新项目了,还是接着写好了(感觉这个项目被我堆成了巨无霸hhh)。

步骤一:加入头文件

#include <QDebug>

步骤二:在.h和.cpp文件中修改鼠标移动的相关函数:

鼠标移动:
void mousePoint::mouseMoveEvent(QMouseEvent* event)
{if (pushButton){fastPoint = event->pos();update();//画出更新位置}QPoint p_ab = event->globalPos();qDebug() << "\n" ;qDebug() << "Position of the Mouse:" << p_ab;QPoint p_re = event->pos();QString str;str = QString("%1 , %2").arg(p_ab.x()).arg(p_ab.y());qDebug() <<"Position in the MainWindow:"<< str;str = QString("%1 , %2").arg(p_re.x()).arg(p_re.y());qDebug() << "Position in the Display Window:" << str;
}

运行结果:

 

 

4. 用Qt实现取点

最后回到我一开始的目的,Qt取点。

修改一下鼠标按下函数: 
void mousePoint::mousePressEvent(QMouseEvent* event)
{//单击// 如果是鼠标左键按下if (event->button() == Qt::LeftButton) {//qDebug() << "left click";setMouseState(MouseState::L_C, 0);fastPoint = event->pos();update();//画出更新位置}// 如果是鼠标右键按下else if (event->button() == Qt::RightButton) {//qDebug() << "right click";setMouseState(MouseState::R_C, 0);}else if (event->button() == Qt::MidButton) {//qDebug() << "mid click";setMouseState(MouseState::M_C, 0);}QPoint p = event->pos();if (event->button() == Qt::LeftButton && p.x() > fastPoint.x() - r / 2 &&p.x() < fastPoint.x() + r / 2 && p.y() > fastPoint.y() - r / 2&& p.y() < fastPoint.y() + r / 2)pushButton = true;}

 

修改后,只要点击左键就会画一个圆。

运行结果:

点击鼠标左键画圆

 

我写的这么详细,应该不需要我再把完整.h和.cpp文件发出来了吧。总得一步步做一遍,对每个函数的功能用法才会更清楚嘛。最后,如果你觉得这篇文对你有帮助,请给博主点赞收藏评论三连hhh 

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

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

相关文章

Java JVM 堆、栈、方法区详解

目录 1. 栈 2. 堆 3. 方法区 4. 本地方法栈 5. 程序计数器 首先来看一下JVM运行时数据区有哪些。 1. 栈 在介绍JVM栈之前&#xff0c;先了解一下 栈帧 概念。 栈帧&#xff1a;一个栈帧随着一个方法的调用开始而创建&#xff0c;这个方法调用完成而销毁。栈帧内存放者方…

智能小程序小部件(Widget)导航、地图、画布等组件,以及开放能力、原生组件说明

智能小程序小部件(Widget)导航、地图、画布等组件&#xff0c;以及开放能力、原生组件说明。 导航组件 navigator 页面链接&#xff0c;控制小程序的跳转。navigator 子节点的背景色应为透明色。 属性说明 属性名类型默认值必填说明urlstring是跳转地址deltanumber1否当 …

npm run dev 启动vue的时候指定端口

使用的是 Vue CLI 来创建和管理 Vue 项目&#xff0c; 可以通过设置 --port 参数来指定启动的端口号。以下是具体的步骤&#xff1a; 打开命令行终端 进入您的 Vue 项目目录 运行以下命令&#xff0c;通过 --port 参数指定端口号&#xff08;例如&#xff0c;这里设置端口号…

力扣 | 11. 盛最多水的容器

双指针解法–对撞指针 暴力解法public int maxArea1(int[] height) {int n height.length;int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int area Math.min(height[i], height[j]) * (j - i);ans Math.max(ans, area);}}return ans;}双指针解法…

VUE组件--动态组件、组件保持存活、异步组件

动态组件 有些场景可能会需要在多个组件之间进行来回切换&#xff0c;在vue中则使用<component :is"..."> 来实现组件间的来回切换 // App.vue <template><component :is"tabComponent"></component><button click"change…

windows安装mysql5.7

看了如何学习mysql后&#xff0c;就开始本地安装mysql&#xff0c;开始学习了。 1.官网下载 官网地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 选择5.7版本 点击 “No thanks, just start my download”开始下载 下载64位的压缩包版 解压下载好的.zip文件&#xf…

各省快递量数据, shp+excel,2001-2021年,已实现数据可视化

基本信息. 数据名称: 各省快递量数据 数据格式: shpexcel 数据时间&#xff1a;2001-2021年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1a_2001快递量/万件_2001年2a_2002快递量/万件_2002年3…

Scrcpy:掌握你的Android设备

Scrcpy&#xff1a;掌握你的Android设备 本文将介绍Scrcpy工具&#xff0c;它是一种强大的安卓设备控制工具&#xff0c;可以实现屏幕镜像、操作控制等功能。我们将探讨Scrcpy的基本原理和工作方式&#xff0c;并介绍如何使用Scrcpy连接和控制安卓设备。此外&#xff0c;我们还…

机器学习---特征选择与稀疏学习

1. 特征 特征&#xff1a;描述物体的属性。 特征的分类&#xff1a;相关特征: 对当前学习任务有用的属性&#xff1b;无关特征: 与当前学习任务无关的属性 特征选择&#xff1a;从给定的特征集合中选出任务相关特征子集&#xff1b;必须确保不丢失重要特征。 原因&#xff…

分享一个基于easyui前端框架开发的后台管理系统模板

这是博主自己在使用的一套easyui前端框架的后台管理系统模版&#xff0c;包含了后端的Java代码&#xff0c;已经实现了菜单控制、权限控制功能&#xff0c;可以直接拿来使用。 springboot mybatis mybatis-plus实现的增删查改完整项目&#xff0c;前端使用了easyui前端框架。…

【Java】HttpServlet类中前后端交互三种方式(query string、form表单、JSON字符串)

在前后端的交互中&#xff0c;前端通过以下三种方式来与后端进行交互&#x1f31f; ✅query string ✅form表单 ✅JSON字符串 下面我们将书写这三种方式的后端代码并进行讲解 1、Query String QueryString即在url中写入键值对&#xff0c;一般用doGet方法进行交互 代码如下 …

Cleanmymac for mac 4.14.7无弹窗注册版

Cleanmymac for mac是一款先进的、集所有功能于一身的实用系统清理工具&#xff0c;删除系统缓存文件 , 多余的应用程序语言包 , 它能帮助保持您的Mac保持清洁。只需两个简单的点击&#xff0c;就可以删除无用的文件&#xff0c;以节省您宝贵的磁盘空间。 对于很多喜爱摄影朋友…

【LeetCode: 215. 数组中的第K个最大元素 + 堆】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

linux|操作系统|centos7物理机安装网卡驱动8188gu(内核升级,firmware固件,USB设备管理,module管理)

前言&#xff1a; 目前服务器领域centos7基本是主流的操作系统&#xff0c;而linux相对于Windows来说&#xff0c;软硬件方面的支持是差很多的&#xff0c;在硬件方面来说&#xff0c;以一个免驱的网卡为例&#xff0c;window xp可能不会自动识别到&#xff0c;但Windows10基本…

DAY04_Spring—Aop案例引入代理机制

目录 1 AOP1.1 AOP案例引入1.1.1 数据库事务说明 1.2 Spring实现事务控制1.2.1 代码结构如下1.2.2 编辑User1.2.3 编辑UserMapper/UserMapperImpl1.2.4 编辑UserService/UserServiceImpl1.2.5 编辑配置类1.2.6 编辑测试类 1.3 代码问题分析1.4 代理模式1.4.1 生活中代理案例1.4…

vue3 实现简单计数器示例——一个html文件展示vue3的效果

目的&#xff1a;作为一个新手开发&#xff0c;我想使用 Vue 3 将代码封装在 HTML 文件中时&#xff0c;进行界面打开展示。 一、vue计数示例 学了一个简单计数器界面展示&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head&…

R语言【paleobioDB】——pbdb_temporal_resolution():展示化石数据的时空分辨率

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_temporal_resolution (data, do.plotTRUE…

uniapp + node.js 开发问卷调查小程序

前后端效果图 后端&#xff1a;nodejs 12.8 ; mongoDB 4.0 前端&#xff1a;uniapp 开发工具&#xff1a;HBuilderX 3.99 前端首页代码 index.vue <!-- 源码下载地址 https://pan.baidu.com/s/1AVB71AjEX06wpc4wbcV_tQ?pwdl9zp --><template><view class&q…

十二、Qt 操作PDF文件(2)

一、在《十、Qt 操作PDF文件-CSDN博客》中我们用Poppler类库打开了PDF文件&#xff0c;并显示到窗体上&#xff0c;但只能显示一页&#xff0c;功能还没完善&#xff0c;在本章节中&#xff0c;加入了&#xff1a; 通过选择框选择PDF文件并打开&#xff0c;默认打开第一页。通…

Spring Boot 配置文件和日志

目录 配置文件格式 properties配置文件说明 1.properties基本语法 2.读取配置文件 3.properties缺点 yml配置文件说明 1.yml基本语法 2.配置不同数据类型 3.字符串特殊情况 4.配置对象 properties和yml对比 日志 日志的使用 日志级别 日志持久化 Lombok Lombo…