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.hqwc.cn/news/422478.html

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

相关文章

基于Matlab计算栅格数据Hurst指数和未来趋势

​各位同学们好&#xff0c;今天分享的基于Matlab计算栅格数据Hurst指数和未来趋势。如果您需要下载或处理遥感数据等方面的帮助&#xff0c;私信或评论。 一、Hurst指数 Hurst指数是一种用于描述未来短时间内变化趋势可持续性的指标&#xff0c;可以在分析年际变化特征方面提…

《文苑》文学艺术文化期刊投稿邮箱投稿方式

《文苑》杂志是国家新闻出版总署批准的正规期刊&#xff0c;本刊致力于中华优秀传统文化、文化旅游、文学艺术、哲学社会科学等方面的理论和实践研究&#xff0c;集理论性、艺术性、指导性于一体&#xff0c;是广大文化、哲学、社会科学工作者交流科研成果、传递学术思想的重要…

Python Tornado 实现SSE服务端主动推送方案

一、SSE 服务端消息推送 SSE 是 Server-Sent Events 的简称&#xff0c; 是一种服务器端到客户端(浏览器)的单项消息推送。对应的浏览器端实现 Event Source 接口被制定为HTML5 的一部分。相比于 WebSocket&#xff0c;服务器端和客户端工作量都要小很多、简单很多&#xff0c…

【网络安全 -> 防御与保护】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全——防御与保护 &#xff08;一&#xff09;.信息安全概述

VSCode插件 —— Cody AI (免费AI助手!)

之前介绍过一款 阿里云免费的AI开发工具——通义灵码 TONGYI Lingma 本文再推荐一个可以极大提高开发前端开发效率的工具 —— Cody AI &#xff08;Sourcegraph&#xff09;&#xff0c;同样是免费的&#xff01; 不过&#xff0c;使用Cody AI需要有github 或 Google 、 git…

xshell配置隧道转移规则

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 xshell是什么 通俗点说就是一款强大ssh远程软件&#xff0c;可以方便运维人员对服务器进行管理操作&#xff0c;功能很多朋友们自行探索&#xff0c;今天只聊其中一个功能点那…

CentOs7 安装Mysql(5.7和8.0版本)密码修改跳过 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

Vue3+ElementUI 多选框中复选框和名字点击方法效果分离

现在的需求为 比如我点击了Option A &#xff0c;触发点击Option A的方法&#xff0c;并且复选框不会取消勾选&#xff0c;分离的方法。 <el-checkbox-group v-model"mapWork.model_checkArray.value"> <div class"naipTypeDom" v-for"item …

常用芯片学习——HC245芯片

HC245三态输出八路总线收发器 使用说明 这些八路总线收发器专为数据总线之间的异步双向通信而设计。控制功能实现可更大限度地减少外部时序要求。根据方向控制 (DIR) 输入上的逻辑电平&#xff0c;此类器件将数据从 A 总线发送至 B 总线&#xff0c;或者将数据从 B 总线发送至…

UCIE协议介绍--芯粒间互联标准

UCIE协议介绍--芯粒间互联标准 1 背景2 UCIE协议介绍2.1 协议层2.2 适配层2.3 物理层2.4 D2D接口 3 Transmission3.1 SideBand数据包3.2 SideBand包格式3.2.1 MRd/Mwr/CfgRd/CfgWr3.2.2 Completion3.2.3 Message 3.3 FDI接口信号 4 链路训练4.1 PHY LSM状态介绍 1 背景 为什么…

Spring boot项目java bean和xml互转

Spring boot项目实现java bean和xml互转 项目场景&#xff1a;互转方法使用jackson进行互转使用jaxws进行xml与bean的互转 搞定收工&#xff01; 项目场景&#xff1a; 工作中需要给下游第三方收费系统做数据挡板&#xff0c;由于下游系统使用的是soap webservice,里面涉及各种…

【开源】基于JAVA语言的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…