【Qt】鼠标拖拽修改控件尺寸---八个方位修改

前提
在开发一个类似qdesiger的项目中
使用QGraphicsProxyWidget将Qt基础控件作为item放在场景视图中显示和编辑
创建自定义类继承QGraphicsProxyWidget,管理控件
成员变量 有控件的xywh等,其中x、y坐标存储是基于最底层widgetitem
坐标系 x轴以右为正方向,y轴以下为正方向
首先鼠标悬浮在控件八个方位范围内时,显示对应的鼠标指针样式

1.mousePress事件存储初始鼠标坐标

void ProxyClass::mousePressEvent(QGraphicsSceneMouseEvent *event)
QPointF pos = event->pos();//Returns the mouse cursor position in item coordinates.
_pressPos= pos;

2.mouseMove事件

void ProxyClass::mouseMoveEvent(QGraphicsSceneMouseEvent *event)

检测到当前状态时调整尺寸而不是移动控件时,获取移动实时的鼠标坐标,然后与初始鼠标坐标相减得出鼠标总的移动的坐标范围值
在这里插入图片描述

  QPointF currentPos = event->pos();QPointF movePoint = currentPos - _pressPos;//移动区域  h↓ y↑

其实鼠标拖拽右、下边框比较简单,只涉及到修改控件尺寸;但是关于左、上边框不仅涉及到修改控件尺寸还涉及到控件坐标值的修改,需要注意一下。

右下例:

   		case E_Right:{qreal w = event->pos().x();if (w > getItemMinSize().width())setItemWidth(w);}break;case E_Bottom:{qreal h = event->pos().y();if (h > getItemMinSize().height())setItemHeight(h);}break;

左、上例:
得到控件高度的变化值 moveSize.y(),与原高度相减,得出此时修改后的高度值,也就是调整后的控件高度值;
与此同时,控件的y坐标也要发生改变,原y坐标+高度变化值 defaultWidgetY() + dy,

因为坐标系y向下为正方向,鼠标拖动上边框往下时差值为正,但是高度是应该减小的,所以此时 h是原高度-移动高度值

		 case E_Top:{int h = getItemHeight() - moveSize.y();const int dy = moveSize.y();trySetGeometry(defaultWidgetX(), defaultWidgetY() + dy, getItemWidth(), h);}break;case E_Left:{int w = getItemWidth() - moveSize.x();const int dx = moveSize.x();trySetGeometry(defaultWidgetX() + dx, defaultWidgetY(), w, getItemHeight());}break;

调用trySetGeometry函数具体设置控件的xywh
:setItemSize函数中默认有resize函数设置修改控件尺寸
:设置修改控件坐标时注意坐标系的转换,setpos(pos)的pos是基于父类图元的坐标
目前坐标 基于默认widgetItem —[mapToScene]转换成—> 场景坐标 —[mapToParent]—>相对该图元的父类图元坐标,然后使用setpos设置修改调整后的控件坐标!
注意:修改后的宽高不要小于控件的最小宽高值

void ProxyClass::trySetGeometry(int x, int y, int width, int height)
{int minw = this->minimumSize().width();//控件的最小宽高int minh = this->minimumSize().height();setItemSize(QSizeF(qMax(minw, width), qMax(minh, height)));//保存+设置控件尺寸  修改后的宽高不要小于控件的`最小宽高值`setDefaultWidgetPos(QPointF(x,y));//保存调整后的坐标//坐标转换+设置调整后坐标if(getRoScene()){auto sc = dynamic_cast<DesignerGraphicsScene*>(getRoScene());auto scPos = sc->getDefaultWidgetItem()->mapToScene(QPointF(x,y));if(parentItem()){auto pPos = mapToParent(mapFromScene(scPos));setPos(pPos);}}
}

3.鼠标释放后再调用修改右树属性值的函数,达到视图中的控件属性状态与右树对应属性值的实时一致。

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

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

相关文章

MySQL基础面试问题(一)

MySQL面试问题的标准回答&#xff1a; 什么是数据库范式&#xff1f;MySQL中常见的范式有哪些&#xff1f; 标准回答&#xff1a;数据库范式是一组规则&#xff0c;用于设计关系型数据库的结构&#xff0c;以减少数据冗余和提高数据的一致性。常见的数据库范式包括第一范式&…

前端快速网格布局

直接进去CSS Grid Generator 真的好方便&#xff1a;

k8s-heml联动harbor 18

将打包的heml包上传到harbor仓库进行管理 创建一个公开的项目来接收传送的heml包 安装helm-push插件&#xff1a; helm plugin install https://github.com/chartmuseum/helm-push &#xff08;在线安装&#xff0c;要求网速要快或者提供科学上网&#xff09; 离线安装&…

速查git命令(大部分常用功能)

创建仓库 git init git clone <url> [directory] 基本语句 git add file/directory git add *.java git status git diff git commit git reset HEAD file 取消缓存内容 git rm <file> git rm -f <file> 强制删除&#xff08;暂存&#xff09; git rm --c…

《Python 语音转换简易速速上手小册》第10章 未来趋势和发展方向(2024 最新版)

文章目录 10.1 语音技术的未来展望10.1.1 基础知识10.1.2 主要案例:语音驱动的虚拟助理案例介绍案例 Demo案例分析10.1.3 扩展案例 1:情感敏感的客服机器人案例介绍案例 Demo案例分析10.1.4 扩展案例 2:多模态智能会议系统案例介绍案例 Demo

rider 缺少iisexpress

File C:/Program Files (x86)/IIS Express/iisexpress.exe doesn’t exist iisexpress下载 64位系统只能安装64位&#xff0c;32位系统安装32位 安装完成之后就有了

LeetCode.2583. 二叉树中的第 K 大层和

题目 2583. 二叉树中的第 K 大层和 分析 这道题其实考察的是二叉树的层序遍历&#xff0c;下面我介绍一个二叉树的层序遍历模版&#xff1a; public List<List<Integer>> levelOrder(TreeNode root) {// 记录最终的结果List<List<Integer>> res n…

物理备份的方式

完全备份恢复流程 停止数据库清理环境重演回滚&#xff0d;&#xff0d;> 恢复数据修改权限启动数据库 1.关闭数据库&#xff1a; [rootmysql-server ~]# systemctl stop mysqld [rootmysql-server ~]# rm -rf /var/lib/mysql/* //删除所有数据// [rootmysql-server ~]# …

常用ADB命令整理已经ADB键盘输入

我们在测试Android app过程中 需要经常更换安装包的操作 熟练使用ADB命令可以提升测试效率 * 查看设备 adb devices ps这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 若有多台安卓设备&#xff0c;可以通过在adb后面加上 -s <设备id>…

java-kotlin踩坑:错误:找不到符号(点击能跳转到对应类中)

问题描述&#xff1a; 在android用java调用一个kotlin定义的类时&#xff0c;导包正常&#xff0c;点击也能跳转到对应类中&#xff0c;但是在编译运行时会报错&#xff0c;提示找不到符号 解决方法&#xff1a; 第一步&#xff1a;在app级别的build.gradle中添加kotlin-and…

【算法与数据结构】684、685、LeetCode冗余连接I II

文章目录 一、684、冗余连接 I二、685、冗余连接 II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、684、冗余连接 I 思路分析&#xff1a;题目给出一个无向有环图&#xff0c;要求去掉一个边以后构成一个树&#xf…

【Linux】 login命令使用

login命令 在 Linux 中用于创建一个新的会话&#xff0c;并在新会话中登录用户。这个命令通常在终端中自动执行&#xff0c;当你打开一个新的终端会话或者通过 SSH 远程连接到 Linux 服务器时。 在命令后面附加欲登入的用户名称&#xff0c;它会直接询问密码&#xff0c;等待…

提示工程(Prompt Engineering)、微调(Fine-tuning) 和 嵌入(Embedding)

主要参考资料&#xff1a; 还没搞懂嵌入&#xff08;Embedding&#xff09;、微调&#xff08;Fine-tuning&#xff09;和提示工程&#xff08;Prompt Engineering&#xff09;&#xff1f;: https://blog.csdn.net/DynmicResource/article/details/133638079 B站Up主Nenly同学…

几种常见的配置文件格式,以及它们的优缺点和用法汇总

文章目录 1. INI2. XML3. JSON4. YAML5. TOML结论 配置文件是用于存储软件程序、操作系统或服务器等的设置的文件。不同的配置文件格式具有不同的结构和语法&#xff0c;选择哪种格式通常取决于具体的应用需求、易用性、可读性以及环境支持。以下是几种常见的配置文件格式&…

【Java程序设计】【C00279】基于Springboot的智慧外贸平台(有论文)

基于Springboot的智慧外贸平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧外贸平台 本系统分为系统功能模块、管理员功能模块、买家功能模块以及商家功能模块。 系统功能模块&#xff1a;在平台首页可以…

Atcoder ABC340 A-D题解

比赛链接:ABC340 话不多说&#xff0c;看题。 Problem A: 签到。 #include <bits/stdc.h> using namespace std; int main(){int a,b,d;cin>>a>>b>>d;for(int ia;i<b;id)cout<<i<<endl;return 0; } Problem B: 还是签到题。一个v…

L4 级自动驾驶汽车发展综述

摘要:为了减小交通事故概率、降低运营成本、提高运营效率,实现安全、环保的出行,自动驾驶 技术的发展已成为大势所趋,而搭配有L4 级自动驾驶系统的车辆是将车辆驾驶全部交给系统。据此,介绍了自动驾驶汽车的主流技术解决方案;分析了国内外L4 级自动驾驶汽车的已发布车型、…

HQYJ 2024-2-23 作业

自己实现单向循环链表的功能 整理思维导图 复习前面顺序表和链表的代码&#xff0c;重写链表逆置函数 1.实现单向循环链表的功能 loop_link_list.h文件 #ifndef __LOOP_LINK_LIST__ #define __LOOP_LINK_LIST__ #include<stdio.h> #include<stdlib.h> typedef…

SOCKS5、代理 IP、HTTP 在软件工程中的应用

在当今数字化时代&#xff0c;网络安全是软件工程领域中至关重要的话题之一。本文将深入探讨 SOCKS5 代理、代理 IP、HTTP 代理等网络代理技术&#xff0c;以及它们在软件工程中的应用&#xff0c;强调网络安全的重要性&#xff0c;并提供一些实用的建议。 1. SOCKS5 代理&…

基础爬虫篇

文章目录 爬虫介绍requsets模块和快速使用携带请求头携带cookie的两种方式post携带参数模拟登录 取出cookie和处理cookie响应对象证书使用代理超时 异常处理 上传文件 爬虫介绍 # 爬虫是什么&#xff1f;-通过编程技术---》把互联网中的数据---》获取到---》数据清洗---》存到…