QT5图形视图框架

简介: GraphicsView (图形视图)框架结构取代了之前版本中的QCanvas模块,它提 供基于图元的模型/视图编程,类似于QtlnterView的模型/视图结构,只是这里的数据是图形。

QT5图形视图框架


图形视图体系结构

GraphicsView (图形视图)框架结构取代了之前版本中的QCanvas模块,它提 供基于图元的模型/视图编程,类似于QtlnterView的模型/视图结构,只是这里的数据是图形。


GraphicsView 的特点

Graphics View框架结构的主要特点如下。


(1) Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL 工具来改善绘图性能。


(2) Graphics View支持事件传播体系结构,可以使图元在场景(scene)中的 交互能力提高一倍,图元能够处理键盘事件和鼠标事件。其中,鼠标事件包括鼠标 按下、移动、释放和双击,还可以跟踪鼠标的移动。


(3 )在 Graphics View 框架中,通过二元空间划分树(Binary Space Partitioning, BSP)提供快速的图元查找,这样就能够实时地显示包含上百万个 图元的大场景。


Graphics View 的三元素

Graphics View框架结构主要包含三个类,场景类(QGraphicsScene)、视图类 (QGraphicsView)和图元类(QGraphicsItem),统称为"三元素”。其中,场景类提 供了一个用于管理位于其中的众多图元容器,视图类用于显示场景中的图元,一个 场景可以通过多个视图表现,一个场景包括多个几何图形。它们三者之间的关系如 图


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvQt9T20-1664354665656)(C:\Users\star\Desktop\LearnC++\learn-c\QT应用开发\pic\GraphView三元素.png)]


(1)场景类:QGraphicsScene类


它是一个用于放置图元的容器,本身是不可见的,必须通过与之相连的视图类 来显示及与外界进行互操作。通过QGraphicsScene::addltem()可以添加一个图元到 场景中。图元可以通过多个函数进行检索。QGraphicsScene::items()和一些重载函数 可以返回和点、矩形、多边形或向量路径相交的所有图元。QGraphicsScene::itemAt() 返回指定点的最顶层图元。


场景类主要完成的工作包括,提供对它包含的图元的操作接口和传递事件,管 理各个图元的状态(如选择和焦点处理),提供无变换的绘制功能(如打印)等。


事件传播体系结构将场景事件发送给图元,同时也管理图元之间的事件传播。 如果场景接收到了在某一点的鼠标单击事件,场景会将事件传给在这一点的图元。


管理各个图元的状态(如选择和焦点处理)。可以通过 QGraphicsScene::setSelectionArea()函数选择图元,选择区域可以是任意的形状,使 用QPainterPath表示。若要得到当前选择的图元列表,则可以使用函数 QGraphicsScene::selectedltems()□可以通过 QGraphicsScene:: setFocusItem()函数或 QGraphicsScene::setFocus()函数来设置图元的焦点,获得当前具有焦点的图元使用 函数 QGraphicsScene::focusltem()。


如果需要将场景内容绘制到特定的绘图设备,则可以使用 QGraphicsScene: :render()函数在绘图设备上绘制场景。


(2) 视图类:QGraphicsView 类


它提供一个可视的窗口,用于显示场景中的图元。在同一个场景中可以有多个 视图,也可以为相同的数据集提供几种不同的视图。


QGraphicsView是可滚动的窗口部件,可以提供滚动条来浏览大的场景。如果 需要使用OpenGL ,则可以使用QGraphicsView::setViewport()将视图设置为 QGLWidgeto


视图接收键盘和鼠标的输入事件,并将它们翻译为场景事件(将坐标转换为场 景的坐标)。使用变换矩阵函数QGraphicsView::matrix()可以变换场景的坐标,实现 场景缩放和旋转。QGraphicsView 提供 QGraphicsView::mapToScene()和 QGraphicsView:: mapFromScene()用于与场景的坐标进行转换。


(3)图元类:QGraphicsItem 类


它是场景中各个图元的基类,在它的基础上可以继承出各种图元类,Qt已经预 置的包括直线(QGraphicsLineltem )、椭圆(QGraphicsEllipseltem )、文本图元 (QGraphicsTextltem)> 矩形(QGraphicsRectltem)等。当然,也可以在 QGraphicsItem 类的基础上实现自定义的图元类,即用户可以继承QGraphicsItem实现符合自己需 要的图元。


QGraphicsItem主要有以下几点功能。


•处理鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件。


•处理键盘输入事件。


•处理拖曳事件。


•分组。


•碰撞检测。


此外,图元有自己的坐标系统,也提供场景和图元。图元还可以通过 QGraphicsItem:: matrix()来进行自身的交换,可以包含子图元。


Graphics View 的坐标系统


1.场景坐标

场景坐标是所有图元的基础坐标系统。场景坐标系统描述了顶层的图元,每个 图元都有场景坐标和相应的包容框。场景坐标的原点在场景中心,坐标原点是X轴 正方向向右,y轴正方向向下。


2.视图坐标

视图坐标是窗口部件的坐标。视图坐标的单位是像素。QGraphicsView视图的 左上角是(0,0), X轴正方向向右,丫轴正方向向下。所有的鼠标事件最开始都是 使用视图坐标。


QGraphicsView类继承自QWidget类,因此它与其他的QWidget类一样,以窗 口的左上角作为自己坐标系的原点。


3.视图坐标

视图坐标是窗口部件的坐标。视图坐标的单位是像素。QGraphicsView视图的 左上角是(0,0), X轴正方向向右,丫轴正方向向下。所有的鼠标事件最开始都是 使用视图坐标。


QGraphicsView类继承自QWidget类,因此它与其他的QWidget类一样,以窗 口的左上角作为自己坐标系的原点。


根据需要,Qt提供了这三个坐标系之间的互相转换函数,以及图元与图元之间 的转换函数,若需从QGraphicsItem坐标系中的某一点坐标转换到场景中的坐标, 则可调用QGraphicsItem的mapToScene()函数进行映射。而QGraphicsItem的 mapToParent()函数则可将QGraphicsItem坐标系中的某点坐标映射至它的上一级坐 标系中,有可能是场景坐标,也有可能是另一个QGraphicsItem坐标。


Graphics View框架提供了多种坐标变换函数

映射函数 转换类型
QGraphicsView: :mapToScene() 视图到场景
QGraphicsView: :mapFromScene() 场景到视图
QGraphicsItem:: mapFromScene() 场景到图元
QGraphicsItem:: mapToScene() 图元到场景
QGraphicsItem:: mapToParent() 子图元到父图元
QGraphicsItem:: mapFromParent() 父图元到子图元
QGraphicsItem:: mapToItem() 本图元到其他图元
QGraphicsItem:: mapFromItem() 其他图元到本图元

QT日常专栏会使用一个例子详细介绍该模块。请关注QT日常专栏更新状态

目录
相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
142 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
3月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
177 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
WK
|
1月前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
73 5
|
3月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
59 10
|
3月前
|
C语言 C++ Windows
QT多插件通信框架CTK编译记录
本文记录了编译QT多插件通信框架CTK的过程,包括编译结果截图、部署配置、Log4Qt编译配置、参考链接和拓展资料。文中提供了详细的编译步骤和配置文件示例,以及相关的资源链接。
QT多插件通信框架CTK编译记录
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
199 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
112 0
|
3月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
3月前
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
204 2