【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.鼠标释放后再调用修改右树属性值的函数,达到视图中的控件属性状态与右树对应属性值的实时一致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

15-36V降压充电光伏MPPT充电方案

1.MPPT原理--简介 MPPT&#xff0c;全称为Maximum Power Point Tracking&#xff0c;即最大功点跟踪&#xff0c;它是一种通过调节电气模块的工作状态&#xff0c;使光伏板能够输出更多电能的电气系统能够将太阳能电池板发出的直流电有效地贮存在蓄电池中&#xff0c;可有效地…

Mac怎么运行赛博朋克2077,使用Game Porting Toolkit

Game Porting Toolkit通过转译的方式&#xff0c;将Direct3D指令翻译成Metal指令&#xff0c;让不少Windows游戏都能够在Apple Silicon Mac上成功运行。作为一款开发者工具&#xff0c;运行起来自然有不少的坑&#xff0c;本文手把手带你在M芯片Mac上运行赛博朋克2077。 CrossO…

数据库期末简答题速成-救命专用

简答题&#xff1a; 第 1 章 绪论 DBMS 的主要功能有哪些&#xff1f; 答&#xff1a;数据库管理系统&#xff08;DBMS&#xff09;是位于操作系统与用户之间的一个数据管理软件&#xff0c;它主要功能包括以下几个方面&#xff1a; 数据定义功能 DBMS提供数据描述语言&…

(响应数据)学习SpringMVC的第三天

响应数据 一 . 传统同步业务数据响应 1.1 请求资源转发与请求资源重定向的区别 请求资源转发时,froward:可不写 二 . 前后端分离异步方式 回写json格式的字符串 1 用RestController代替Controller与 ResponseBody 2 . 直接返回user对象实体 , 即可向 前端ajax 返回json字…

day02_java基础_变量_数据类型等

零、今日内容 1 HelloWorld程序 2 idea使用 3 变量 4 数据类型 5 String 一、复习 班规班纪。。。。。 安装jdk JDK 是开发工具 JRE 是运行代码 JDK包含JRE 配置环境变量 二、HelloWorld程序 前提&#xff1a;JDK已经安装配置完毕&#xff0c;有了这些环境就敲代码 代码…

Protocol Buffers v21.12 安装 ( linux 系统 )

下载 Protocol Buffers v21.12 Protocol Buffers v21.12 解压 tar zxvf protobuf-cpp-3.21.12.tar.gz执行 进入解压目录&#xff0c;执行下面configure可执行程序&#xff0c;目的是监测安装环境&#xff0c;生成makefile ./configure执行完后可以检查是否生成makefile文件 构…

kaggle网站简单介绍

Kaggle 是一个面向数据科学和机器学习爱好者的在线平台&#xff0c;它提供了一个用于数据科学竞赛、数据集分享和模型训练的环境。这个平台由 Kaggle Inc. 运营&#xff0c;Kaggle Inc. 是一家位于美国加州旧金山的人工智能公司。 Kaggle 最有特色的功能之一是举办各种数据科学…

MongoDB实战 – 用Python访问MongoDB数据库

MongoDB实战 – 用Python访问MongoDB数据库 MongoDB in Action – Access MongoDB Databases with Python By JacksonML Python语言功能强大众所周知&#xff0c;在数据库管理领域也无所不能。MongoDB是文档数据库&#xff0c;属于NoSQL数据库的一种&#xff0c;在业界也非常…

Java实现就医保险管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

多层的二叉树结构如何快速写出其前序、中序、后序。

问题描述&#xff1a;多层的二叉树结构如何快速写出其前序、中序、后序。 问题解答&#xff1a;从顶部的二叉树&#xff0c;依次往下写&#xff0c;先写出第一层的二叉树&#xff0c;然后再写第二层的二叉树。当然按照的规则还是前序根左右&#xff0c;中序左根右&#xff0c;后…

Shiro 1.2.4反序列化漏洞

一、shiro描述 Apache Shiro是一个强大且易用的Java安全框架&#xff0c;执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API&#xff0c;可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序 二、漏洞原理 AES加密的密钥Key被硬…

K线实战分析系列之六:启明星——空方力量减弱信号

KK线实战分析系列之六&#xff1a;启明星——空方力量减弱信号 一、星线二、多种反转形态三、启明星形态四、启明星形态的总结 一、星线 星线在单根K线形态上是属于纺锤线&#xff0c;之所以被称为星线&#xff0c;主要是因为它在行情当中的相对位置&#xff0c;区别于其他纺锤…

postman测试上传文件、导出excel的方法

按照如下操作步骤执行就可以了&#xff1a; 1、PostMan测试接口实现上传文件 第一步&#xff1a; 打开postman&#xff0c;将上传方式改为POST&#xff0c;再点击下【Body】 第二步&#xff1a; 然后&#xff0c;我们点击里面的【form-data】选项(如图所示)。 第三步&#xff…

基于编译器的静态代码分析与软件开发效率、质量和性能

基于编译器的静态代码分析与软件开发效率、质量和性能 本文节选自《基础软件之路&#xff1a;企业级实践及开源之路》一书&#xff0c;该书集结了中国几乎所有主流基础软件企业的实践案例&#xff0c;由 28 位知名专家共同编写&#xff0c;系统剖析了基础软件发展趋势、四大基…

EtherCAT 转 ModbusTCP 网关

功能概述 本产品是 EtherCAT 和 Modbus TCP 网关&#xff0c;使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站&#xff0c;接 TwinCAT 、CodeSYS 、PLC 等&#xff1b;在 ModbusTCP 侧做为 ModbusTCP 主站&#xff08;Client&#xff09;或从站&#xff08;Se…

RabbitMq:什么是RabbitMq? ①

一、RabbitMq定位 RabbitMq是一个基于消息订阅发布的一款消息中间件。 二、技术原理 核心概念 server&#xff1a;又称broker&#xff0c;接受客户端连接&#xff0c;实现AMQP实体服务。缓存代理&#xff0c;Kafka集群中的一台或多台服务器统称broker.connection&#xff1a;…

VUE基础知识九 ElemrntUI项目

ElementUI官网 一 项目 最终完成的效果&#xff1a; 切换上边的不同按钮&#xff0c;下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后&#xff0c;引入ElementUI&#xff08;搭建、引入ElementUI步骤在第七节里已…

数据库管理-第154期 Oracle Vector DB AI-06(20240223)

数据库管理154期 2024-02-23 数据库管理-第154期 Oracle Vector DB & AI-06&#xff08;20240223&#xff09;1 环境准备创建表空间及用户TNSNAME配置 2 Oracle Vector的DML操作创建示例表插入基础数据DML操作UPDATE操作DELETE操作 3 多Vector列表4 固定维度的向量操作5 不…

链表 迭代方式实现链表反转

#include <stdio.h> #include <stdlib.h> 这两行是包含标准的输入输出库和动态内存分配库&#xff0c;以便你能够使用 printf、scanf 和 malloc 函数。 struct Node{//定义一个结构体类型 作为节点 int data;//存储整型数据 struct Node* next;//存储下一…

【Java】继承与抽象(实验三)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 了解继承的概念&#xff0c;掌握派生类的定义。掌握派生类构造方法的执行过程。掌握方法的重载与覆盖。掌握抽象类的概念及上转型对象的使用 二、实验内容 1、定义一个抽象类Shape&#xff0c;类中封装属性name…