qt 实现拖动矩形角度_Qt 绘图之图形视图框架
恒歌科技
2019/11/29
在Qt中我们可以通过QWidget的派生类,重写paintEvent()函数,使用QPainter绘制我们想要的任何内容。这种方法对于从QWidget派生的窗口部件很理想,但如果要绘制大量独立的项,向用户提供与图形项交互(如鼠标交互等),通常需要大量的工作。
图形视图架构,则完美地满足了基于图形项的高性能绘制和交互的需求。
在Qt4中,图形视图基于Qt中GUI和QtCore模块,该架构的设计取代并超越了Qt3的QCanvas。它提供了一个平台,用于大量自定义2D图元的管理与交互,使用一个BSP(Binary Space Partitioning - 二叉空间分割)树,以提供对图形元素的快速查找。正因如此,它可以使超大的场景实时地可视化,即使其包含数百万的图元。
框架包括一个事件传播架构,支持场景(Scene)中的图元(Item)进行精确的双精度交互功能。图元可以处理键盘事件、鼠标按下、移动、释放和双击事件,同时也能跟踪鼠标移动。
1
图形视图架构
图形视图的 场景、视图、 图元,作为图形视图架构的三要素。其中每个图元从抽象类(QGraphicsItem)派生而来,场景(QGraphicsScene)作为模型容纳管理各个绘制项,视图(QGraphicsView) 用来可视化显示数据,如有需要,我们可以在多个不同的视图内显示同一场景。
场景
QGraphicsScene提供了图形视图场景。它提供了一个快速的接口,用于管理大量图元、向每个图元传递事件、管理图元的状态,如:选中、焦点处理等。
场景是QGraphicsItem对象的容器。通过调用QGraphicsScene::addItem()将图元添加到场景中后,你就可以通过调用场景中的不同的查找函数来查找其中的图元。
QGraphicsScene::items()函数及其重载函数可返回所有图元。包括:点、矩形等;通过QGraphicsScene::itemAt()接口返回在特定点上最上面的图元。所有找到的图元按照层叠递减的排列顺序(即:最先返回的图元是最顶层的,最后返回的则是最底层的)。
QGraphicsScene的事件传递机制负责将场景事件传递给图元,同时也管理图元之间的传递。如果场景在某个位置得到一个鼠标按下事件,就将该事件传递给这个位置上的图元。QGraphicsScene同时还管理某些图元的状态,例如:图元的选中和焦点。
视图
提供一个可视的窗口,用于显示场景中的图元。对于同一个场景,可以提供多个不同/相同的视图来显示其元素。
QGraphicsView是可滚动的窗口部件,用来提供滚动条以浏览大的场景。如需使用OpenGL,可用QGraphicsView::setViewport()将视图设置为QGLWidget。如果你希望OpenGL具有反锯齿,则需要OpenGL支持采样缓冲。视图的类层次图如下图:
图元
QGraphicsItem是场景中图元的基类。其中提供了一些典型形状的标准图元,例如:矩形 、椭圆 、文本项 。当然你也可以自定义图元项。除此之外,QGraphicsItem还支持以下特性:鼠标按下、移动、释放和双击事件,以及鼠标悬浮事件、滚轮事件和上下文菜单事件;键盘输入焦点和键盘事件;拖放;分组:通过父子关系或QGraphicsItemGroup;碰撞检测。
每个图元项都有一个z值,z值较大的项会被绘制在z值较小的项之上,这样就可以调整覆盖图元项的显示顺序;每个图元项可以是场景或者另一个项的子对象,当对一个项进行了矩阵变换,该项的所有子对象会自动的应用该变换,递归应用至最深层次的子孙对象。
如果让子项忽略所有父项的变换,可以通过调用QGraphicsItem::setFlag(QGraphicsItem::ItemIgnoresTransformations)来实现。Qt中图元项的类层次结构如下图所示(具体用法请参见Qt帮助文档):
2
图形视图坐标系
图形视图基于笛卡儿坐标系,场景中图元的位置和几何形状由两组数据来表示:X坐标和Y坐标。当使用一个未转换的视图来观察一个场景,场景中的一个单元将会由场景上的一个像素表示。图形视图中使用了三种有效的坐标系: 图元坐标、 场景坐标、 视图坐标。
图元坐标
图元的绘制在自己的局部坐标系。它们的坐标通常围绕它们的中心点(0, 0),并且这也是所有转换的中心。创建自定义图元时,只需考虑图元坐标即可。QGraphicsScene和QGraphicsView会为你实现所有相关的转换,这样一来,实现自定义图元就容易多了。图元绑定的矩形(boundingRect())或形状区域(shape())也是项坐标系统的。
子坐标是相对于父坐标而言的,如果子坐标没有转换,那么子坐标和父坐标的差异就和图元在父坐标中的距离一样,图元的位置(pos)是图元的中心点在其父坐标系下的坐标,有时也被称为父坐标。
如果这个图元直接加到场景中则它的位置在场景坐标中,由于图元的位置和转换是相对于父图元来说的,因此,虽然父图元的转换隐式地转换了子图元,但是子图元的坐标不会因其转换而受影响。不过相对于场景来说,子图元将随着父图元进行转换和偏移 。图元坐标系如下图所示:
场景坐标系
场景为所有图元提供了基础坐标系。场景坐标系描述了每个顶层图元的位置,同时构成了从视图传递到场景中所有事件的基础。其中每个图元都有一个场景位置以及坐标系下的矩形边界(QGraphicsItem::scenePos()QGraphicsItem::sceneBoundingRect()),场景坐标系如下图所示:
视图坐标系
视图坐标是窗口的坐标,视图坐标中的每个单位对应一个像素。对于该坐标系来说较特殊的一点是:它相对于视口,不会受被观察的场景所影响。QGraphicsView以窗口的左上角作为自己坐标系的原点总是(0, 0),右下角总是(width, height)。所有的鼠标事件和拖拽事件都以视图坐标接收到的,你需要将这些坐标映射到场景,以便于和图元进行交互。视图坐标系如下图:
坐标映射
3
事 件
当QGraphicsView接收到Qt鼠标、键盘和拖放事件(QMouseEvent、QKeyEvent、QDragEvent等)时,它会将其转换为QGraphicsceneEvent子类的实例,并转发到它显示的QGraphicscene。然后,场景再将事件转发到相关图元项,即:视图->场景->图元。图形视图中事件的类层次如下:
4
动 画
图形视图在几个层面上提供了对动画的支持。实现图元动画有三种方法:
1) 使用Qt中的Animation Framework框架,QPropertyAnimation可以为任何QObject属性实现动画效果,所以你的图元必须继承QObject和QGraphicsItem。
2) 创建一个自定义图元,从QObjcet和QGraphicsItem继承,该图元可以通过定时来驱动实现动画。
3) 调用QGraphicsScene::advance()从而依次调用QGraphicsItem::advance();
5
示 例
自定义图元示例
构建一个场景视图示例
向场景中添加了一个矩形,一个圆:
* 注: 本文介绍基于Qt4.8.6.
qt 实现拖动矩形角度_Qt 绘图之图形视图框架相关推荐
- 【Qt】2D绘图之图形视图框架(一)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...
- qt 实现拖动矩形角度_PPT技巧应用—利用PPT的遮罩效果来实现文字的炫彩变化
在运用PPT的实际过程当中,很多小伙伴不知道怎么操作才能完成文字的特殊炫彩效果,下面我们就来给大家讲讲如何通过PPT的遮罩效果来实现文字的超级炫彩功能. 首先,我们新建一个空白PPT文档,在插入菜单下 ...
- qt 实现拖动矩形角度_手机上如何使用CAD角度标注功能?
浩辰CAD看图王角度标注功能的增加,给我们的一些绘图,编辑等操作带来了很大的方便,可以快速完成一些简单的操作.那下面就为大家简单介绍下新功能角度标注的具体操作步骤.具体的操作步骤如下所示: 1. 创建 ...
- [Qt教程] 第20篇 2D绘图(十)图形视图框架(下)
[Qt教程] 第20篇 2D绘图(十)图形视图框架(下) 楼主 发表于 2013-5-4 15:43:02 | 查看: 861| 回复: 0 图形视图框架(下) 版权声明 该文章原创于Qter开源社 ...
- [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)
[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主 发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...
- Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享,咨询请 ...
- Qt图形视图框架:QGraphicsScene详解
一.描述 1.场景提供了一个用于管理大量2D图形项的平面.该类充当图形项的容器. 它与视图一起用于可视化2D曲面上的图形图形项. 2.场景没有自己的视觉外观,只负责管理图形项. 3.场景的最大优势之一 ...
- Qt修炼手册6_图形:图形视图框架
1.前言 主要为了学习可以在GUI上有效显示或管理大量图形对象的API,以及进行显示.扩大.缩小等操作. 2.图形视图框架(Graphics View Framework) 图形视图框架使用BSP树算 ...
- 【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo
1.简介 使用的主要类:QGraphicsTextItem.QGraphicsScene.QGraphicsView. QGraphicsTextItem继承自QGraphicsObject,而QGr ...
最新文章
- 一般判五年几年能出来_判刑五年能减刑多少年
- MFC设置静态文本框,编辑框等控件背景和字体颜色
- 可视化应用实战案例:绘制交互式+pdf+png等多格式桑基图
- 【NLP】GitHub 上有哪些有趣的关于 NLP 的Python项目?
- DCMTK:测试dcmiod的代码序列宏实现
- linux 6.5 gcc包,centos6.5离线安装gcc gcc++ rpm
- 【C/C++11】天气APP:txt/xml文件处理入库(psurfdata.cpp,_shqx.h),数据结构设计(PowerDesigner)
- linux ls in*,35 ls Command Examples in Linux (The Complete Guide)
- 青苹果影视系统源码v1.3.20 多功能开源影视源码
- 玩转ptrace (一)
- flex 引入html,在Flex中嵌入完整HTML页面
- 多目标最优化模型及算法应用(NSGA-II)
- matlab读取npy文件
- c2c网站开店的流程图_C2C电子商务网站的交易流程
- 15款Django开发常用软件包
- 4.致远插件的初使用 1Rest远程调用项目介绍
- python控制风扇_Python 语音控制普通风扇实现教程
- 英语数字表达方式大全
- android 8 平板,击败Android平板:Windows 8志在必得
- 浙大计算机考研导学,2016届浙大计算机考研复习经验整理
热门文章
- STM32工作笔记0054---串口通信实验讲解--自定义发送接收数据协议
- SpringCloud学习笔记001-SpringCloud_001_SpringCloud简介_单体架构_微服务架构_服务注册与发现_微服务调用关系
- JSP自定义标签rtexprvalue属性 1
- SQL Server 2012 各版本功能比较
- Windows 下 C/C++ 多线程编程入门参考范例
- WM6.5中隐藏和显示任务栏、命令栏及输入面板
- 嵌入式操作系统内核原理和开发(多线程轮转)
- java面试请你谈谈mysql_Java面试题之MySQL
- x12arima季节调整方法_你所不知道的秋冬季节养生要点,都在这里!
- 的usb驱动裁剪协议_飞利浦25W双USB-A口车载快充充电器拆解