继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Qt 之 Graphics View Framework

心之宙
关注TA
已关注
手记 71
粉丝 37
获赞 167

交互式 2D 图形的 Graphics View 框架概述。自 Qt4.2 中引入了 Graphics View,以取代其前身 QCanvas。Graphics View 提供了一个用于管理和交互大量的可定制的 2D 图形项与用于可视化这些项的 View 小部件的 surface(曲面),并提供缩放(zooming)和旋转(rotation)功能支持。

该框架包括事件传播体系结构(an event propagation architecture),该体系结构允许对场景中的项目进行精确的双精度交互功能。图元可以被如下操作处理:按键事件,鼠标按下,移动,释放和双击事件,它们还可以跟踪鼠标的移动。

Graphics View 使用 BSP(二进制空间分区)树提供了非常快速的图元发现功能,因此,它可以实时可视化大型场景(甚至可以包含数百万个图元)。下面列出 Graphics View Framework 的常用模块:

QtCore.QObject
QtWidgets.QGraphicsScene
QtGui.QPaintDevice
QtWidgets.QWidget
QtWidgets.QFrame
QtWidgets.QAbstractScrollArea
QtWidgets.QGraphicsView
QtWidgets.QGraphicsObject
QtWidgets.QGraphicsTextItem
QtWidgets.QGraphicsWidget
QtWidgets.QGraphicsLayoutItem
QtCharts.QChart
QtWidgets.QGraphicsItem
QtWidgets.QAbstractGraphicsShapeItem
QtWidgets.QGraphicsItemGroup
QtWidgets.QGraphicsLineItem
QtWidgets.QGraphicsPixmapItem
QtWidgets.QGraphicsEllipseItem
QtWidgets.QGraphicsPathItem
QtWidgets.QGraphicsPolygonItem
QtWidgets.QGraphicsRectItem
QtWidgets.QGraphicsSimpleTextItem

The Graphics View Architecture

Graphics View 提供了一种基于项目(item-based)的方法来进行模型视图编程(model-view programming),非常类似于 InterView 的便利类 QTableView,QTreeView 和 QListView。多个视图可以观察单个场景,并且该场景包含各种几何形状的项目。

1 The Scene

QGraphicsScene 提供了 Graphics View 场景。场景具有如下功能:

  • 提供用于管理大量项目的快速界面
  • 将事件传播到每个项目
  • 管理项目状态,例如选择和焦点处理
  • 提供未被转换的渲染功能;主要用于印刷

场景用作 QGraphicsItem 对象的容器。它与 QGraphicsView 一起用于可视化 2D 曲面上(2D surface)的图形项目,例如线条,矩形,文本,甚至是自定义项目。通过调用 addItem() 将项目添加到场景中,然后通过调用许多项目查找功能之一来检索项目。items() 及其重载返回由点,矩形,多边形或通用矢量路径包含或相交的所有项目。itemAt() 返回特定点的最外层项目(topmost item)。所有项目查找功能均以降序堆叠的方式返回项目(即,第一个返回的项目是最顶部,而最后一个项目是最底部)。

请注意,QGraphicsScene 没有自己的视觉外观。它只管理图元项目。您需要创建一个 QGraphicsView 小部件以可视化场景。

比如:

from xinet import QtWidgets, QtGui, QtCore
from xinet.run_qt import run


class MainWindow(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.resize(500, 400)
        scene = QtWidgets.QGraphicsScene(self)  # 创建场景
        scene.addText("Hello, world!")  # 在场景中添加文本
        view = QtWidgets.QGraphicsView(scene, self)  # 创建视图窗口
        view.move(10, 10)
        view.show()


if __name__ == '__main__':
    run(MainWindow)

要将项目添加到场景,首先需要构造一个 QGraphicsScene 对象。然后,您有两个选择:通过调用 addItem() 添加现有的 QGraphicsItem 对象,或者可以调用下列便捷函数之一 addEllipse()addLine()addPath()addPixmap()addPolygon()addRect()addText(),它们都返回一个指向新添加项目的指针。使用这些功能添加的图元的维度是相对于图元(item)的坐标系的,并且图元的位置在场景中被初始化为 (0,0)(0,0)(0,0)

您可以使用 QGraphicsView 可视化场景。当场景发生变化时(例如,当某项移动或变换时),QGraphicsScene 发出 change() 信号。要删除项目,请调用 removeItem()

QGraphicsScene 使用索引算法来有效地管理项目的位置。默认情况下,使用 BSP(二进制空间分区)树;一种适用于大型场景的算法,其中大多数图元保持静止(即不要四处移动)。您可以选择通过调用 setItemIndexMethod() 禁用此索引。

通过调用 setSceneRect() 设置场景的边界矩形。可以将图元项目放置在场景中的任何位置,默认情况下,场景的大小不受限制。场景 rect 仅用于内部簿记,维护场景的图元项目索引。如果未设置场景矩形,则 QGraphicsScene 将使用 itemsBoundingRect() 返回的所有项目的边界区域作为场景矩形。但是,itemsBoundingRect() 是一个相对耗时的函数,因为它通过收集场景中每个项目的位置信息进行操作。因此,在大型场景上操作时,应始终设置场景 rect。

场景的调用方法:

QGraphicsScene(sceneRect[, parent=None])
QGraphicsScene(x, y, width, height[, parent=None])

QGraphicsScene 的最大优势之一就是能够有效确定图元的位置。即使场景中有数百万个项目,items() 函数也可以在几毫秒内确定项目的位置。items() 有多个重载:一个重载在某个位置查找项目,一个重载在多边形或矩形内部或与之相交,等等。返回的项目列表按堆叠顺序排序,最高的项目是列表中的第一项目。为了方便起见,还有一个 itemAt() 函数可在给定位置返回最上面的项目。

QGraphicsScene 维护场景的选择信息。要选择项目,请调用 setSelectionArea(),并要清除当前选择,请调用clearSelection()。调用 selectedItems() 以获取所有选定项的列表。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP

热门评论

11111

查看全部评论