qt 创建一个矩形,矩形的边线可以拖拽,拖拽时这个矩形随着这个边线缩放

在Qt中,要创建一个矩形,其边线可以拖拽以实现缩放功能,你需要重写QGraphicsRectItem类,并在其中处理鼠标事件来更新矩形的大小。以下是一个示例代码,展示了如何实现一个可拖拽边线以缩放的矩形:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QMouseEvent>
#include <QGraphicsSceneMouseEvent>
//https://blog.csdn.net/xie__jin__cheng/article/details/140438674?spm=1001.2014.3001.5501
//qt 创建一个矩形,矩形的边线可以拖拽,拖拽时这个矩形随着这个边线缩放
class ResizableRectItem : public QGraphicsRectItem {
public:ResizableRectItem(const QRectF &rect, QGraphicsItem *parent = nullptr): QGraphicsRectItem(rect, parent),dragging(false),dragStartSize(QSizeF()),dragStartPos(QPointF()) {}protected:void mousePressEvent(QGraphicsSceneMouseEvent *event) override {if (event->button() == Qt::LeftButton) {// Check if the mouse click is close to any of the rectangle's edgesQRectF rect = this->rect();QPointF pos = event->pos();QSizeF size = rect.size();const int edgeSensitivity = 5; // Pixelsif (qAbs(pos.x() - rect.x()) < edgeSensitivity) {// Left edgedragging = true;dragStartSize = size;dragStartPos = pos;currentEdge = LeftEdge;} else if (qAbs(pos.x() - (rect.x() + rect.width())) < edgeSensitivity) {// Right edgedragging = true;dragStartSize = size;dragStartPos = pos;currentEdge = RightEdge;} else if (qAbs(pos.y() - rect.y()) < edgeSensitivity) {// Top edgedragging = true;dragStartSize = size;dragStartPos = pos;currentEdge = TopEdge;} else if (qAbs(pos.y() - (rect.y() + rect.height())) < edgeSensitivity) {// Bottom edgedragging = true;dragStartSize = size;dragStartPos = pos;currentEdge = BottomEdge;}}//QGraphicsRectItem::mousePressEvent(event);}void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {if (dragging) {QPointF pos = event->pos();QSizeF newSize = dragStartSize;switch (currentEdge) {case LeftEdge:newSize.setWidth(dragStartSize.width() - ( pos.x()-dragStartPos.x()));this->setRect(QRectF(pos.x(), this->rect().y(), newSize.width(), this->rect().height()));break;case RightEdge:newSize.setWidth(dragStartSize.width() + (pos.x() - dragStartPos.x()));this->setRect(QRectF(this->rect().x(), this->rect().y(), newSize.width(), this->rect().height()));break;case TopEdge:newSize.setHeight(dragStartSize.height() - (pos.y() - dragStartPos.y()));this->setRect(QRectF(this->rect().x(), pos.y(), this->rect().width(), newSize.height()));break;case BottomEdge:newSize.setHeight(dragStartSize.height() + (pos.y() - dragStartPos.y()));this->setRect(QRectF(this->rect().x(), this->rect().y(), this->rect().width(), newSize.height()));break;}}//QGraphicsRectItem::mouseMoveEvent(event);}void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override {dragging = false;QGraphicsRectItem::mouseReleaseEvent(event);}private:bool dragging;QSizeF dragStartSize;QPointF dragStartPos;enum Edge { LeftEdge, RightEdge, TopEdge, BottomEdge };Edge currentEdge;
};class MainWindow : public QGraphicsView {
public:MainWindow(QWidget *parent = nullptr) : QGraphicsView(parent) {auto *scene = new QGraphicsScene(this);this->setScene(scene);auto *rect = new ResizableRectItem(QRectF(10, 10, 200, 100));scene->addItem(rect);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.resize(400, 300);window.show();return app.exec();
}

在这个示例中,ResizableRectItem类重写了mousePressEventmouseMoveEventmouseReleaseEvent方法来处理拖拽和缩放操作。当用户按下鼠标左键并移动鼠标时,如果鼠标指针位于矩形的边缘附近,矩形会根据拖动的方向进行缩放。

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

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

相关文章

关系数据库:mysql

使用 mysqladmin 删除数据库 关系型数据库的术语&#xff1a; 数据库: 数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行&#xff1a;一行&#xff08;元组…

idea双击没有反应,打不开

问题描述 Error opening zip file or JAR manifest missing : /home/IntelliJ-IDEA/bin/jetbrains-agent.jar解决方案

前端路由手写Hash和History两种模式

文章目录 1. Hash模式&#xff1a;简洁而广泛适用2. History模式&#xff1a;更自然的用户体验3. 结论 在现代Web开发中&#xff0c;单页面应用&#xff08;Single Page Application&#xff0c;简称SPA&#xff09;因其流畅的用户体验和高效的页面交互能力而备受青睐。前端路由…

PyTorch人脸识别

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 一套基本的人脸识别系统主要包含三部分&#xff1a;检测器、识别器和分类器&#xff0c;流程架构如图11-3所示&#xff1a; 图11-5 检测器负责检测图片中的人脸&#xff0c;再将检测出来的人脸感兴趣区域&#xff08;Reg…

第二届大数据、计算智能与应用国际会议(BDCIA2024)

会议日期&#xff1a;2024年11月15-17日 会议地点&#xff1a;中国-湖北省-黄冈市 主办单位&#xff1a;黄冈师范学院 【大会主席】 【主讲嘉宾】 大会邀请到来自美国、英国、加拿大、新加坡、意大利、越南等10余位领域内学术大咖作主题报告&#xff0c;并与参会人员互动交…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥是否存在(ArkTS)】

查询密钥是否存在(ArkTS) HUKS提供了接口供应用查询指定密钥是否存在。 开发步骤 指定密钥别名keyAlias&#xff0c;密钥别名最大长度为64字节。初始化密钥属性集。用于查询时指定密钥的属性TAG&#xff0c;比如查询的密钥范围(全量/单个)&#xff0c;当查询单个时&#xff…

【区块链 + 智慧政务】城市公积金中心区块链基础服务平台 | FISCO BCOS应用案例

当前&#xff0c;多方呼吁拓展住房公积金服务渠道、提高服务效率、整合各方资源、简化业务办理流程&#xff0c;实现住房公积金 管理中心业务模式由“管理型”向“服务型”转变。 安存推出的城市公积金中心区块链基础服务平台&#xff0c;基于 FISCO BCOS 联盟链搭建&#xff…

分布式IO系统BL201 Profinet耦合器

BL201耦合器是一个数据采集和控制系统&#xff0c;基于强大的32 位微处理器设计&#xff0c;采用Linux操作系统&#xff0c;是一种模块化的分布式I/O系统。该系统由3部分组成&#xff1a;现场总线耦合器和各种类型的&#xff08;数字和模拟信号以及特殊功能&#xff09;I/O模块…

Ubuntu18 中JDK的安装

文章目录 一、背景说明二、获取安装包三、安装JDK3.1 上传安装包3.2 复制和解压3.3 环境变量的设置3.4 验证安装 四、问题列表4.1 .bashrc文件在哪里&#xff1f;.bashrc是什么&#xff1f;4.2 为什么使用rz上传安装包时会报&#xff1a; 传输失败&#xff1f; 五、总结 一、背…

解决RuntimeError: Couldn‘t load custom C++ ops. This can happen if your PyTorch

问题描述 刚下好yolov8的代码&#xff0c;想测一下能否成果&#xff0c;果然没成功&#xff0c;报错如下 RuntimeError: Couldnt load custom C ops. This can happen if your PyTorch and torchvision versions are incompatible, or if you had errors while compiling tor…

kettle从入门到精通 第七五课 ETL之kettle血缘,数据血缘

在了解kettle血缘之前&#xff0c;咱们先来了解下什么是数据血缘&#xff1f; 1、数据血缘定义&#xff08;来自gpt&#xff09; 数据血缘&#xff08;Data Lineage&#xff09;是指在数据管理和数据分析中追踪数据的源头、流向和处理过程的能力。具体来说&#xff0c;数据血…

《昇思25天学习打卡营第21天|基于 MindSpore 实现 BERT 对话情绪识别》

#学习打卡第21天# 1. BERT 模型 BERT全称是来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;&#xff0c;它是Google于2018年末开发并发布的一种新型语言模型&#xff0c;是基于Transformer中的Encoder并加上双向…

org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook$Factory

org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook$Factory POI的问题 在操作Excel时&#xff0c;出现这个问题是因为缺少了poi-ooxml-schema jar包&#xff0c;并且与poi的jar包版本一致

昇思25天学习打卡营第21天 | 基于MindSpore的红酒分类实验

内容简介 本实验介绍了使用MindSpore框架实现K近邻算法&#xff08;KNN&#xff09;对红酒数据集进行分类的全过程。通过数据读取、预处理、模型构建与预测&#xff0c;展示了KNN算法在红酒数据集上的应用。实验中详细解释了KNN的原理、距离度量方式及其在分类问题中的应用&…

Flutter对接FlutterBugly 报错Zone mismatch

在Flutter对接FutterBlugy时报如下错误: Unhandled Exception: Zone mismatch. E/flutter ( 1292): The Flutter bindings were initialized in a different zone than is now being used. This will likely cause confusion and bugs

PyTorch张量创建和随机数生成器算法

文章目录 1、基本创建方式1.1、根据已有数据创建张量1.2、根据已有数据创建张量1.3、根据已有数据创建张量 2、创建线性和随机张量2.1、创建线性空间的张量2.2、创建随机张量2.3、什么是随机数种子2.4、initial_seed()和manual_seed() 3、创建01张量3.1、全0张量3.2、全1张量3.…

Springboot+Aop用注解实现阿里云短信验证码校验,校验通过自动删除验证码缓存

1.新建操作类型枚举&#xff08;这里的IEnum是我自定义的http请求拦截接口&#xff0c;不需要的话可以不用实现&#xff09; Getter AllArgsConstructor public enum OperationType implements IEnum<Integer> {/*** 注册*/SIGN_UP(0),/*** 密码登录*/LOGIN_BY_PWD(1),/…

Apache Lucene 详解及示例

Apache Lucene 详解及示例 1. 简介 Apache Lucene 是一个高性能的全文搜索引擎库&#xff0c;广泛应用于构建搜索系统。本文将详细解析 Lucene 的核心概念和主要功能&#xff0c;并通过多个示例代码演示其使用方法。 2. 核心概念 2.1 倒排索引 倒排索引将文档中的每个词条…

【Java18】初始化块

初始化块和构造器、成员变量、成员方法一起&#xff0c;是唯四能在类中出现的成员。 初始化块的作用和构造器类似&#xff0c;目的是对对象进行初始化操作&#xff1b;一个类中可以有多个初始化块&#xff1b;初始化块只有两种修饰方式&#xff1a;static和default。用static修…

向量数据量milvus k8s helm 对接外部安装部署流程

前情概要&#xff1a;历经了太多的坑&#xff0c;从简单的到困难的&#xff0c;该文章主要是为大家尽可能的展现安装部署流程中遇见的坑&#xff01; 如果2024年7月15日17:13:41 你处在这个时间阶段 附近&#xff0c;你会发现docker下载镜像失败&#xff01; 这个问题&#xff…