图形/视图结构的三个坐标系

图形/视图结构的三个坐标系分别为视图结构系=物理结构系,场景坐标系,图形项坐标系。
本文记录实践三个坐标系及视图与场景坐标转换,通过事件槽来显示出来的过程。

  1. 自定义1个View视图组件,其中扩展了鼠标点击、鼠标移动的事件,在这两个事件中分别发送/广播了信号 鼠标按下左键、鼠标移动的信号
  2. 在主窗体中,使用该自定义的视图组件,
  3. 定义1个矩形框,然后将矩形框设置为场景
  4. 在该场景中添加1个蓝色椭圆图形项,1个红色圆的图形项
  5. 通过槽函数展示

在主窗体中,接收自定义组件发出的鼠标移动、鼠标点击左键的信号,在主窗体实现的槽函数中展示鼠标移动时,物理坐标(视图坐标)、场景坐标、图形项的坐标

自定义扩展GraphicsView组件

主界面设计

View组件提升为TGraphicsView

定义矩形区域,设置为场景

 

    //1. 创建一个区域 从 -200,-100开始,长400宽200QRectF rect(-200,-100,400,200);//2. 在这个位置上创建一个场景scene= new QGraphicsScene(rect,this);//3.给视图设置场景ui->view->setScene(scene);

画出该矩形-场景中添加矩形

可选,可选中

    //4.1添加一个矩形框QGraphicsRectItem *item = new QGraphicsRectItem(rect);//可选中的,可获取焦点item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);//给item设置画笔QPen pen;pen.setWidth(2);item->setPen(pen);scene->addItem(item);//默认坐标 在scene的 0,0

 场景中添加椭圆

可移动、可选中、可获取焦点

    //4.2矩形框内创建一个椭圆,左上角坐标 -100,-50, 宽200 高100QGraphicsEllipseItem *eItem = new QGraphicsEllipseItem(-100,-50,200,100);eItem->setPos(0,0);//图形项在场景中的坐标eItem->setBrush(QBrush(Qt::blue));eItem->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);scene->addItem(eItem);

 场景中添加圆

    //4.3矩形框内创建一个椭圆,左上角坐标 -100,-50, 宽100 高100  变成一个圆 填充红色QGraphicsEllipseItem *rItem = new QGraphicsEllipseItem(-50,-50,100,100);//设置到矩形框的右下角rItem->setPos(rect.right(),rect.bottom());        //图形项在场景中的坐标rItem->setBrush(QBrush(Qt::red));rItem->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);scene->addItem(rItem);

场景清除选中

 scene->clearSelection();

鼠标十字星,开启鼠标跟踪、视图内组件拖曳模式

    ui->view->setCursor(Qt::CrossCursor);//设置十字光标ui->view->setMouseTracking(true);//设置鼠标跟踪后,才能获取到mouseMoveEventui->view->setDragMode(QGraphicsView::RubberBandDrag);//矩形选择框

绑定信号处理的槽

    connect(ui->view,SIGNAL(mouseMovePoint(QPoint)),this,SLOT(do_mouserMoveEvent(QPoint)));connect(ui->view,SIGNAL(mouseClicked(QPoint)),this,SLOT(do_mouseClicked(QPoint)));

鼠标移动执行槽

void GraphicsViewWindow::do_mouserMoveEvent(QPoint point)
{//传入的point 是 GraphicsView的坐标,物理坐标qDebug()<<"do_mouserMoveEvent...";labViewCord->setText(QString::asprintf("View坐标:%d,%d",point.x(),point.y()));QPointF pointScene =ui->view->mapToScene(point);//转换到Scene坐标labSceneCord->setText(QString::asprintf("Scene坐标:%0.f,%0.f",pointScene.x(),pointScene.y()));
}

鼠标点击执行槽

void GraphicsViewWindow::do_mouseClicked(QPoint point)
{//点击图形项的时候,显示Scene坐标,item坐标QPointF pointScene = ui->view->mapToScene(point);QGraphicsItem *item =NULL;item = scene->itemAt(pointScene,ui->view->transform());//获取光标下的绘图项if(item!=NULL){QPointF pointItem = item->mapFromScene(pointScene);//转换为绘图labItemCord->setText(QString::asprintf("Item坐标:%.0f,%.0f",pointItem.x(),pointItem.y()));}
}

主窗体大小变化事件

窗口大小变化时,视图的sceneRect矩形的坐标始终未发生变化

void GraphicsViewWindow::resizeEvent(QResizeEvent *event)
{QString str = QString::asprintf("GraphicsView坐标,左上角是(0,0),宽度=%d,高度=%d",ui->view->width(),ui->view->height());ui->labViewSize->setText(str);QRectF rectF = ui->view->sceneRect();QString strScene = QString::asprintf("GraphicsView::sceneRect(Left,Top,Width,Height)=(%0.f,%0.f,%0.f,%0.f)",rectF.left(),rectF.top(),rectF.width(),rectF.height());ui->labSceneRect->setText(strScene);event->accept();
}

结果

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

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

相关文章

Golang | Leetcode Golang题解之第297题二叉树的序列化与反序列化

题目&#xff1a; 题解&#xff1a; type Codec struct{}func Constructor() (_ Codec) {return }func (c Codec) serialize(root *TreeNode) string {if root nil {return "X"}left : "(" c.serialize(root.Left) ")"right : "("…

前端渲染模式

渲染的概念 在Web开发中&#xff0c;渲染&#xff08;Rendering&#xff09;是一个核心概念&#xff0c;指的是将应用程序的数据&#xff08;data&#xff09;与模板&#xff08;template&#xff09;结合&#xff0c;生成最终的HTML页面&#xff0c;这个页面随后会被浏览器解析…

主宰生物进化的 “魔咒” —— 制约生物在特殊环境下进化方式的线索

一些神秘的法则制约着生物在特殊环境下的进化方式。它们还为动物将如何适应气候变暖提供了线索。 一些奇特的进化现象 一艘装满大象和老鼠的 “诺亚方舟” 搁浅在一座偏远的小岛上。动物们都幸存下来并繁衍后代。但是&#xff0c;随着世代相传&#xff0c;奇怪的事情发生了&a…

【基础篇】Docker 概览 ONE

嗨&#xff0c;大家好&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。今天我将带领大家一起踏上探索 Docker 的奇妙之旅。我们先从 Docker 的历史和发展说起&#xff0c;然后再看看 Docker 和虚拟机之间的区别&#xff0c;最后了解一下 Docker 在各行各业的应用情况…

环境配置—批量删除时提示/usr/bin/rm: Argument list too long问题

文章目录 1. 背景介绍2. 问题原因3. 解决方案3.1 分批删除文件3.2 使用 find 命令直接删除3.3 增加系统参数限制3.4 使用循环删除 4. 结论 1. 背景介绍 在Linux系统中&#xff0c;rm 命令是删除文件和目录的常用工具。然而&#xff0c;当需要删除大量文件时&#xff0c;可能会…

【论文10】复现代码tips

一、准备工作 1.创建一个虚拟环境 conda create --name drgcnn38 python=3.8.18 2.激活虚拟环境 conda activate drgcnn38 注意事项 在Pycharm中终端(terminal)显示PS而不是虚拟环境base 问题如下所示 解决方法:shell路径改成cmd.exe 重启终端显示虚拟环境 3.安装torch …

Kafka知识总结(事务+数据存储+请求模型+常见场景)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 事务 事务Producer保证消息写入分区的原子性&#xff0c;即这批消…

国内本地化OCSP服务的SSL证书:提升安全与效率的新选择

在数字化时代&#xff0c;网络安全成为企业运营和用户体验的重要基石。HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;作为一种安全的网络协议&#xff0c;通过SSL&#xff08;Secure Sockets Layer&#xff09;加密技术&#xff0c;保障了数据传输的机密性…

MATLAB基础应用精讲-【数模应用】Poisson 回归分析(附R语言代码实现)

目录 前言 知识储备 基于泊松回归、负二项回归模型 数据分布介绍 模型介绍 模型的选择 案例介绍 算法原理 泊松回归 数学模型 适用条件 参数估计与假设检验 SPSSAU Poisson 回归案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解…

OpenSSL SSL_connect: Connection was reset in connection to github.com:443

OpenSSL SSL_connect: Connection was reset in connection to github.com:443 目录 OpenSSL SSL_connect: Connection was reset in connection to github.com:443 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&…

kuberneter管理GUI工具Lens

从github上可以知道&#xff0c;lens的前端是用electron做的客户端工具&#xff0c;打开安装路径你会发现kubectl.exe,没错&#xff0c;就是你经常用的kubectl命令行的客户端工具。kubectl本来就能输出json的数据类型&#xff0c;集成前端更方便了。看到这里你是不是发现&#…

前端Long类型精度丢失:后端处理策略

文章目录 精度丢失的具体原因解决方法1. 使用 JsonSerialize 和 ToStringSerializer2. 使用 JsonFormat 注解3. 全局配置解决方案 结论 开发商城管理系统的品牌管理界面时&#xff0c;发现一个问题&#xff0c;接口返回品牌Id和页面展示的品牌Id不一致&#xff0c;如接口返回的…

Transformer--输入部分

&#x1f3f7;️上文我们简单介绍了Transformer模型的总体架构&#xff0c;本章我们主要介绍其输入部分 &#x1f4d6;前言 &#x1f4d6;文本嵌入层的作用 &#x1f4d6;位置编码器的作用 &#x1f4d6;前言 输入部分主要包括源文本嵌入层以及位置编码器&#xff0c;目标文本…

HX1838红外接收模块-红外遥控(外部中断+状态机)

目录 红外遥控 模块介绍 HX1838红外接收二极管 红外发射遥控器 遥控器键码 模块接线 NEC协议编码 状态机分析 驱动代码 IR.h IR.c main.c 红外遥控 红外遥控是利用红外光进行通信的设备&#xff0c;由红外LED将调制后的信号发出&#xff0c;由专用的红外接收头进行…

Unity + Hybridclr + Addressable + 微信小程序 热更新报错

报错时机&#xff1a; Generate All 怎么All 死活就是报错 生成微信小程序&#xff0c;并启动后 报错内容&#xff1a; MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因&#xff1a; Hybridclr 开发文档 解…

SSL/TLS和SSL VPN

1、SSL/TLS SSL安全套接字层&#xff1a;是一种加密协议&#xff0c;用于在网络通信中建立安全连接。它在应用层和传输层&#xff08;TCP/IP&#xff09;之间提供数据加密、服务器身份验证以及信息完整性验证 SSL只保护TCP流量&#xff0c;不保护UDP协议 TLS&#xff1a;传输层…

成为git砖家(4): git status 命令简介

1. untracked 和 tracked 状态 Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, o…

Nginx周末部署

背景 Nginx是本人学习的一类中间件&#xff0c;上次完成了vue的搭建&#xff0c;所以顺便把项目加入Nginx吧 1. 镜像拉取与测试 查询dockerHub&#xff0c;选择最新最稳定的版本 docker pull nginx:stable-perl 执行下载 docker run -d --name mynginx -p 8080:80 -v D:\IM…

基于bert的自动对对联系统

目录 概述 演示效果 核心逻辑 使用方式 1.裁剪数据集 根据自己的需要选择 2.用couplet数据集训练模型 模型存储在model文件夹中 3.将模型转换为ONNX格式 4.打开index.html就可以在前端使用此自动对对联系统了。 本文所涉及所有资源均在传知代码平台可获取。 概述 这个生成器利用…

面完英伟达算法岗,心态崩了。。。

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…