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

news2024/12/25 1:52:21

在研究医学图像可视化的时候,鼠标响应这里一直都有问题。研究了几天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 click
	R_C,
	M_C,
	L_DC,//left double click
	R_DC,
	Wheel,//wheel move
	Release
};

 设置控件初始状态:

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();//保存旧的painter
	font = painter.font();
	font.setPointSize(12);
	painter.setFont(font);
	painter.setBrush(QBrush(QColor(200, 200, 100)));

	painter.drawEllipse(fastPoint, r, r);//原点为fastPoint,半径为30


	painter.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.coloradmin.cn/o/1395392.html

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

相关文章

【Ant Design of Vue】Modal.confirm无法关闭的bug

一、问题 在使用 Ant Design Vue 的 Modal.confirm 确认框时&#xff0c;出现了点击取消和确定后 Modal.confirm 确认框无法关闭的问题 二、代码 代码完全是 copy 的官网的代码&#xff0c;但是 copy 到本地后就会出现上述问题 <template><a-button click"sho…

基于gd32f103移植freemodbus master 主栈

1.移植freemodbus master需要先移植RT-Thread操作系统 GD32F103C8T6移植 RTT Nano 教程-CSDN博客 2.移植freemodbus master协议栈 在移植了RTT以后,我们需要移植就只有串口相关的函数 移植freemodbus master协议栈具体步骤 下载移植freemodbus master协议栈 源码添加协议栈…

ora-12154无法解析指定的连接标识符

用户反映查询的时候报错ora-12154 这个系统只做历史数据查询使用&#xff0c;使用并不平凡&#xff0c;该数据库曾做过一次服务器间的迁移。 用户描述&#xff0c;所有oracle客户端查询该视图都报tns错误&#xff0c;一般ora-12154会发生在连接数据库时&#xff0c;因为tns配…

Python数据分析案例36——基于神经网络的AQI多步预测(空气质量预测)

案例背景 不知道大家发现了没&#xff0c;现在的神经网络做时间序列的预测都是单步预测&#xff0c;即(需要使用X的t-n期到X的t-1期的数据去预测X的t期的数据)&#xff0c;这种预测只能预测一个点&#xff0c;我需要预测X的t1期的数据就没办法了&#xff0c;有的同学说可以把预…

Vue 3 hooks的基本使用及疑问

前言 vue3也用过一段时间了&#xff0c;hooks听说过&#xff0c;但是一直没有用过。公司的前端项目里也没有相应的应用&#xff0c;因此打算系统的学习一下。 hooks与普通函数的区别 以实现一个加法功能为例。 普通函数未抽离 <template><div class"box&quo…

【Vue】Vue 路由的配置及使用

目录捏 前言一、路由是什么&#xff1f;1.前端路由2.后端路由 二、路由配置1.安装路由2.配置路由 三、路由使用1.route 与 router2. 声明式导航3. 指定组件的呈现位置 四、嵌套路由&#xff08;多级路由&#xff09;五、路由重定向1.什么是路由重定向&#xff1f;2.设置 redire…

接口自动化测试框架设计

文章目录 接口测试的定义接口测试的意义接口测试的测试用例设计接口测试的测试用例设计方法postman主要功能请求体分类JSON数据类型postman内置参数postman变量全局变量环境变量 postman断言JSON提取器正则表达式提取器Cookie提取器postman加密接口签名 接口自动化测试基础getp…

JVM实战(28)——模拟Metaspace内存溢出

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

15.云原生之k8s容灾与恢复实战

云原生专栏大纲 文章目录 Velero与etcd介绍Velero与etcd备份应用场景Velero与etcd在k8s备份上的区别 Velero备份恢复流程备份工作流程Velero备份时&#xff0c;若k8s集群发送变化&#xff0c;会发发生情况&#xff1f;Velero 备份pv&#xff0c;pv中数据变化&#xff0c;会发发…

C++ //练习 1.25 借助网站上的Sales_item.h头文件,编译并运行本节给出的书店程序。

C Primer&#xff08;第5版&#xff09; 练习 1.25 练习 1.25 借助网站上的Sales_item.h头文件&#xff0c;编译并运行本节给出的书店程序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************************…

Flutter中使用minio_new库

前言 在移动开发中&#xff0c;我们常常会遇到需要在App中处理文件上传和下载的需求。Minio是一个开源的对象存储服务&#xff0c;它兼容Amazon S3云存储服务接口&#xff0c;可以用于存储大规模非结构化的数据。 开始之前 在pubspec.yaml文件中添加minio_new库的依赖&#xf…

最终Docker6:nacos集群部署

目录 mysql容器构建 1.进入soft 文件夹&#xff0c;创建mysql文件夹 2.进入conf文件夹 放入my.conf 配置文件 3.运行mysql容器 4.进入script文件夹 导入 sql文件 5.进入mysql 容器 并登录 6.创建nacos 数据库并使用&#xff0c;运行nacos.sql文件 7.授予用户所有权限 部…

loading stable diffusion model: FileNotFoundError解决方案

大家好&#xff0c;我是水滴~~ 本文主要介绍在安装 stable-diffusion-webui 时出现的 loading stable diffusion model: FileNotFoundError 问题的解决方案&#xff0c;希望能对你有所帮助。 文章目录 问题描述解决方案 问题描述 在安装 stable-diffusion-webui 过程中出现 l…

Linux环境下,针对QT软件工程搭建C++Test单元测试环境的操作指南

文章目录 前言一、安装QT二、安装CTest三、使用QT生成.bdf文件四、创建CTest工程注意事项 前言 CTest是Parasoft公司出品的一款可以针对C/C源代码进行静态分析、单元测试、集成测试的测试工具。本文主要讲解如何在Linux环境下&#xff0c;搭建QT插件版的CTest测试环境。 一、…

大数据开发之Hadoop(优化新特征)

第 1 章&#xff1a;HDFS-故障排除 注意&#xff1a;采用三台服务器即可&#xff0c;恢复到Yarn开始的服务器快照。 1.1 集群安全模块 1、安全模式&#xff1a;文件系统只接收读数据请求&#xff0c;而不接收删除、修改等变更请求 2、进入安全模式场景 1&#xff09;NameNod…

GPT应用开发:GPT插件开发指南

欢迎阅读本系列文章&#xff01;我将带你一起探索如何利用OpenAI API开发GPT应用。无论你是编程新手还是资深开发者&#xff0c;都能在这里获得灵感和收获。 本文&#xff0c;我们将继续展示聊天API中插件的使用方法&#xff0c;让你能够轻松驾驭这个强大的工具。 插件运行效…

记一次 .NET某道闸收费系统 内存溢出分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他的程序几天内存就要爆一次&#xff0c;不知道咋回事&#xff0c;找不出原因&#xff0c;让我帮忙看一下&#xff0c;这种问题分析dump是最简单粗暴了&#xff0c;拿到dump后接下来就是一顿分析。 二&…

移动web开发流式布局

1.0 移动端基础 1.1 浏览器现状 PC端常见浏览器&#xff1a;360浏览器、谷歌浏览器、火狐浏览器、QQ浏览器、百度浏览器、搜狗浏览器、IE浏览器。 内核&#xff1a; 浏览器内核备注Safariwebkitwebkit内核是苹果公司开发的一款渲染引擎&#xff0c;目前已被很多手机厂商所采…

Java开发的审批流系统,前端使用vue,支持常态化工作审批流程

一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;快速开发平台&#xff0c;可插拔工作流服务。 二、项目介绍 本项目拥有用户管理&#xff0c;部门管理&#xff0c;代码生成&#xff0c;系统监管&#xff0c;报表&#xff0c;大屏展示&#xff0c;业…

文心一言使用分享

ChatGPT 和文心一言哪个更好用&#xff1f; 一个直接可以用&#xff0c;一个还需要借助一些工具&#xff0c;还有可能账号会消失…… 没有可比性。 通用大模型用于特定功能的时候需要一些引导技巧。 import math import time def calculate_coordinate(c, d, e, f, g, h,…