QT学习之图形视图框架
文章目录
- 坐标系统
- 图形项坐标
- 场景坐标
- 视图坐标
- 坐标映射
- 事件处理与传播
- QGraphicsScene 管理 QGraphicsItem(单击/选择/移动/缩放/删除)
- 参考
坐标系统
图形项坐标
图元生活在自己的局部坐标系。它们的坐标通常围绕它们的中心点(0, 0),并且这也是所有转换的中心。图元坐标系下的几何元素通常指点、线或矩形。
创建自定义图元时,只需考虑图元坐标即可。QGraphicsScene和QGraphicsView会为你实现所有相关的转换,这样一来,实现自定义图元就容易多了。例如:当你接收到鼠标按下或拖拽事件时,事件位置将由图元坐标给出。如果某一点(传递一个图元坐标作为参数)在图元中,那么GraphicsItem::contains()虚函数将会返回true;否则,返回false。同样的,项绑定的矩形或形状区域也是项坐标系统的。同样的,图元的矩形边界和形状都是基于图元坐标的。
图元的位置是图元的中心点在其父坐标系下的坐标,有时也被称为父坐标。场景从这个意义上说是所有无父图元的“parent”,顶层图元的位置在场景坐标中。
子坐标是相对于父坐标而言的。如果子坐标没有转换,那么子坐标和父坐标的差异就和图元在父坐标中的距离一样。例如:一个未经转换的子图元正好位于父图元的中心点,那么,这两个图元的坐标系是完全一样的。如果子图元的位置是(10, 0),那么子图元的(0, 10)点就对应父图元的(10, 10)点位置。
由于图元的位置和转换是相对于父图元来说的,因此,虽然父图元的转换隐式地转换了子图元,但是子图元的坐标不会因父图元的转换而受到影响。在上述示例中,即使父图元经过了旋转和缩放,子图元的(0, 10)点始终对应父图元的(10, 10)点。不过相对于场景来说,子图元将随着父图元进行转换和偏移 。如果父图元缩放了(2x, 2x),那么子图元在场景中的坐标是(20, 0),并且其(10, 0)点将会对应于场景中的(40, 0)点。
不管图元或父图元进行了怎样的转换,QGraphicsItem的函数操作都在图元坐标内。例如:一个图元的矩形边界(QGraphicsItem::boundingRect())总是在图元坐标下给出。但是QGraphicsItem::pos()是例外之一,该函数表示其在父图元中的位置 。
场景坐标
场景为所有的图元提供了基础的坐标系。场景坐标系描述了每一个顶层图元的位置,同时构成了从视图传递到场景的所有场景事件的基础。场景中的每个图元都有一个场景位置和矩形边界(QGraphicsItem::scenePos()、QGraphicsItem::sceneBoundingRect());另外,也有其自身的位置和矩形边界。场景位置描述了图元在场景坐标下内的位置,场景矩形边界则提供给QGraphicsScene来决定场景中的哪块区域已经被改变了。场景中的变化通过QGraphicsScene::changed()信号发出,参数是场景矩形列表。
视图坐标
视图坐标是部件的坐标,视图坐标中的每个单位对应一个像素。对于该坐标系来说比较特殊的一点是:它相对于部件或视口,不会受被观察的场景所影响。QGraphicsView的视口左上角总是(0, 0),右下角总是(viewport width, viewport height)。所有的鼠标事件和拖拽事件都以视图坐标接收到的,你需要将这些坐标映射到场景,以便于和图元进行交互。
坐标映射
事件处理与传播
QGraphicsScene 管理 QGraphicsItem(单击/选择/移动/缩放/删除)
学习见链接
如果想让场景使用橡皮筋进行框选,则可以使用:
setDragMode(QGraphicsView::RubberBandDrag);
但是图形项不能设置成:
setFlag(QGraphicsItem::ItemIsFocusable);
而是应该设置成:
setFlag(QGraphicsItem::ItemIsSelectable);
这里提供一份代码:可以使用
使用shift+鼠标左键单选
使用ctrl+鼠标左键多选
使用鼠标的橡皮筋进行多选
参考
https://blog.csdn.net/liang19890820/article/details/51966791
QT学习之图形视图框架相关推荐
- QT学习:图形视图Graphics View
一.Graphics View框架结构的主要特点 (1)在Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿.OpenGL工具来改善绘图性能. (2) Graphics View支 ...
- Qt工作笔记-图形视图框架中的分组,以及添加平行拖动图元
啥意思,感觉本人语文学得菜,不好描述. 直接看程序运行截图: 1.隐藏鼠标: 2.图元分组: 3.视图与场景坐标转换 程序源码如下: mygraphicsitem.h #ifndef MYGRAPHI ...
- 【Qt】2D绘图之图形视图框架(一)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...
- [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)
[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主 发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...
- Qt图形视图框架:QGraphicsScene详解
一.描述 1.场景提供了一个用于管理大量2D图形项的平面.该类充当图形项的容器. 它与视图一起用于可视化2D曲面上的图形图形项. 2.场景没有自己的视觉外观,只负责管理图形项. 3.场景的最大优势之一 ...
- 【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo
1.简介 使用的主要类:QGraphicsTextItem.QGraphicsScene.QGraphicsView. QGraphicsTextItem继承自QGraphicsObject,而QGr ...
- Qt修炼手册6_图形:图形视图框架
1.前言 主要为了学习可以在GUI上有效显示或管理大量图形对象的API,以及进行显示.扩大.缩小等操作. 2.图形视图框架(Graphics View Framework) 图形视图框架使用BSP树算 ...
- [Qt教程] 第20篇 2D绘图(十)图形视图框架(下)
[Qt教程] 第20篇 2D绘图(十)图形视图框架(下) 楼主 发表于 2013-5-4 15:43:02 | 查看: 861| 回复: 0 图形视图框架(下) 版权声明 该文章原创于Qter开源社 ...
- Qt图形视图框架详解-安晓辉-专题视频课程
Qt图形视图框架详解-12227人已学习 课程介绍 介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...
最新文章
- 水电缴费系统php源码_简易水电费管理系统源程序代码
- java mysql 操作类_Java 数据库简单操作类
- build.gradle里uploadArchives标签的实现原理
- 电子商务网站 数据库产品表设计方案
- bzoj 1026: [SCOI2009]windy数
- 微信弹出遮罩层引导用户浏览器打开升级版
- python开发桌面软件实例-Python开发的第一步:利用Python开发一个桌面小程序
- 山东理工ACM[2108]一元二次方程Ⅲ
- 垃圾分类小程序,识别和站点查询,答题,用户后台管理集一体的小程序
- 房屋装修自装,如何自己做装修设计
- 启用新博客域名 www.qiuchengjia.cn
- 百问网七天物联网课程学习笔记——单片机时钟
- Java如何使用直接内存?
- 为期近五个月的英语培训班总结
- C++解OJ题--最大子数组和(第一次尝试动态规划,很烧脑)
- crpc流程图_传输设备施工作标准.doc
- matlab的2维矩阵和3维矩阵维度变换,二维矩阵变换三维矩阵,2D矩阵转换3D矩阵
- 一台机器开启多个tomcat7 绿色版
- MXNET深度学习框架-09-使用正则化方法解决过拟合问题(以从0开始的线性回归为例)
- 论VPN 网络传输的安全性影响
热门文章
- Oracle根据日期区间查询Date类型的数据
- 2022-2028年中国散热产业深度调研及投资前景预测报告(全卷)
- 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别
- Python2 与 Python3 区别
- 【JavaScript总结】JavaScript发展与学习内容
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
- equals()与hashCode()
- Mysql分页order by数据错乱重复
- GPU上稀疏矩阵的基本线性代数
- PyTorch全连接ReLU网络