QT(12):QGraphicsView

一、QGraphicsView

QGraphicsView将场景中的内容在可滚动的viewport中可视化

class Q_WIDGETS_EXPORT QGraphicsView : public QAbstractScrollArea{};
//QWidget *viewport是QAbstractScrollArea的私有类中的成员变量

用于可视化场景
1、若要可视化场景中的内容,首先构造一个QGraphicsView对象,将要可视化的场景的地址传递给QGraphicsView的构造函数;或者调用setScene函数在初始化视图后设置场景。默认情况下,视图将滚动到场景的中心,并显示此时可见的任何项目。

  • QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr)
  • setScene:设置场景
  • scene:返回场景

2、可以使用滚动条滚动到场景中的任何位置,通过将点传递给centerOn()显示设置,通过将点传递给该函数,视图将滚动viewport以确保该点在视图中居中。
如果你想确保某个区域是可见的(但不一定居中),可以调用ensureVisible(),视图将滚动viewport使item的中心位于视图中心。

  • centerOn:滚动视口的内容,以确保场景坐标在视图中居中。
  • ensureVisible:滚动视区的内容,使场景矩形可见
  • fitlnView:缩放视图矩阵并滚动滚动条以确保场景矩形适合viewport。
  • scrollContentsBy:继承于QAbstractScrollArea

3、视图可用于可视化整个场景,或者仅仅可视化其中一部分。默认情况下,首次显示视图会自动检测可视化区域(QGraphicsScene::itemsBoundingRect)。也可以自己调用setSceneRect设置可视化区域矩形,会自动调整滚动条的范围。尽管场景支持几乎无限的大小,但滚动条的范围永远不会超过整型的范围。

4、视图通过调用render()来可视化场景。默认情况下,通过使用常规的QPainter和默认呈现提示将项目绘制到viewport上。若要更改视图在绘制item时传递到QPainter的默认呈现提示,可以调用setRenderHints()。

  • resetCachedContent:重置所有缓存的内容。
  • setOptimizationFlag:设置优化选项
  • setRenderHint:设置渲染提示选项
  • render:使用painter将位于视图坐标中的矩形从场景渲染到目标设备(位于绘画设备坐标中)。此功能可用于将视图的内容捕获到绘画设备上,例如QImage(例如,截取屏幕截图)或打印到QPrinter。

viewport widget:
默认情况下,QGraphicsView 为viewport widget提供一个常规的QWidget。可以通过调用setViewport来访问此widget,也可以通过调用setViewport()来替换它。要使用OpenGL渲染,只需调用setViewport(new QOpenGLWidget)。QGraphicsView拥有viewport widget的所有权。

QTransform支持仿射变换:
QGraphicsView通过使用QTransform支持仿射变换。可以将一个矩阵传递给setTransform(),也可以调用方便使用的函数rotate(), scale(), translate()或shear()之一。最常见的两种转换是缩放scale和旋转rotate。QGraphicsView 在转换期间保持视图的中心固定。由于场景对齐,平移视图不会产生视觉影响。

  • resetTransform:将视图转换重置为单位矩阵。
  • setTransform:设置变换矩阵
  • transform:返回变换矩阵
  • shear :扭曲当前视图
  • translate:平移当前视图
  • scale:缩放当前视图
  • rotate:当前视图顺时针旋转指定角度。

item处理事件并对其做出反应:
可以使用鼠标和键盘与场景中的项目进行交互。QGraphicsView 将鼠标和键盘事件转换为场景事件(继承自QGraphicsSceneEvent的事件),并转发到可视化场景。最后,是单个item处理事件并对其做出反应。例如,如果单击可选item,该item通常会让场景知道它已被选中,并且它还会重绘自身以显示选择矩形。同样,如果单击并拖动鼠标来移动可移动item,则处理鼠标移动和自身移动的是该item。默认情况下启用item交互,您可以通过调用setInteractive()来切换它。

创建 QGraphicsView 的子类提供自己的自定义场景交互:
还可以通过创建 QGraphicsView 的子类并重新实现鼠标和键事件处理程序来提供自己的自定义场景交互。为了简化以编程方式与视图中的项交互的方式,QGraphicsView 提供了映射函数mapToScene()和mapFromScene(),以及item访问器items()和itemAt()。这些函数允许在视图坐标和场景坐标之间映射点、矩形、多边形和路径,并使用视图坐标查找场景中的item。

  • itemAt:返回一个满足某个条件item
  • items:返回全部满足某个条件的item
  • mapFromScene:场景坐标映射为视图坐标
  • mapToScene:视图坐标映射为场景坐标
  • 信号rubberBandChanged,选择区域矩形更改时发出
  • rubberBandRect:返回选择区域矩形大小

使用 QOpenGLWidget 作为视口:
使用 QOpenGLWidget 作为视口时,支持立体渲染。这是使用与QOpenGLWidget::paintGL相同的模式完成的。要启用它,请启用 QSurfaceFormat::StereoBuffers 标志。由于标志在内部的处理方式,请在使用 QSurfaceFormat::setDefaultFormat()创建窗口之前全局设置标志QSurfaceFormat::StereoBuffers flag。如果启用了该标志,并且有对立体渲染的硬件支持,则drawBackground() and drawForeground()将每帧触发两次。调用 QOpenGLWidget::currentTargetBuffer()来查询当前正在绘制的缓冲区。

二、枚举类型:

enum QGraphicsView::CacheModeFlag
QGraphicsView的缓存模式
QGraphicsView::CacheNone,所有绘画都直接在视口上完成。
QGraphicsView::CacheBackground,背景已缓存。这会影响自定义背景和基于属性的背景。启用此标志后,将分配一个具有视区完整大小的像素图。

enum QGraphicsView::DragMode
在viewport上按下并拖动鼠标时QGraphicsView的默认操作。
QGraphicsView::NoDrag,什么也没发生;鼠标事件将被忽略。
QGraphicsView::ScrollHandDrag,光标变为指向的指针,拖动鼠标将滚动条。此模式在非交互模式下均有效。
QGraphicsView::RubberBandDrag,将出现rubber band。拖动鼠标将设置rubber band几何形状,并选择rubber band覆盖的所有项目。对于非交互式视图,此模式处于禁用状态。

enum QGraphicsView::OptimizationFlag
可以启用这些标志以提高QGraphicsView中的呈现性能。默认情况下,不会设置任何这些标志。请注意,设置标志通常会施加副作用,并且此效果可能因绘画设备和平台而异。

enum QGraphicsView::ViewportAnchor
调整视图大小或转换视图时QGraphicsView可以使用的可能定位点。
QGraphicsView::NoAnchor,没有锚点,即视图使场景的位置保持不变。
QGraphicsView::AnchorViewCenter,视图中心的场景点用作定位点。
QGraphicsView::AnchorUnderMouse,鼠标下方的点用作锚点。

enum QGraphicsView::ViewportUpdateMode
此枚举描述当场景内容更改或显示时QGraphicsView如何更新其viewport。

三、属性

alignment:整个场景可见时视图中场景的对齐方式。默认居中对齐。

backgroundBrush:场景的背景画笔。
此属性设置此视图中场景的背景画笔。用于覆盖场景自己的背景,并定义drawBackground()的行为。
若要为此视图提供自定义背景绘图,可以改为重新实现 drawBackground()。

cacheMode:缓存视图的哪些部分。
将预呈现的内容缓存在一个QPixmap中,然后将其绘制到viewport上。此类缓存的目的是加快渲染速度较慢的区域的总渲染时间。
每次变换视图时,缓存都会失效。但是,滚动时部分失效。
默认情况下,不缓存任何内容。

dragMode:按下鼠标左键时将鼠标拖到场景上的行为。
此属性定义当用户单击场景背景并拖动鼠标(例如,使用指向手形光标滚动viewport内容或使用rubber band选择多个项目)时应发生的情况。默认值不执行任何操作。
此行为仅影响任何项目未处理的鼠标单击。您可以通过创建QGraphicsView的子类并重新实现mouseMoveEvent()来定义自定义行为。

interactive:视图是否允许场景交互。
如果启用,此视图将设置为允许场景交互。否则,此视图将不允许交互,并且忽略任何鼠标或键事件(即充当只读视图)。默认为true。

optimizationFlags:优化选项。
使用剪切、额外的边界矩形调整和某些其他辅助来提高常见案例图形场景的渲染质量和性能。
但是,根据目标平台、场景和正在使用的视口,其中一些操作可能会降低性能。默认不开启任何优化。

renderHints:视图的渲染提示选项。
这些提示用于在绘制每个可见项之前进行初始化。使用渲染提示切换渲染功能,例如抗锯齿和平滑像素图转换。默认启用。

resizeAnchor:调整视图大小时视图应如何定位场景。
使用此属性可以决定当视口构件的大小更改时如何在视口中定位场景。
默认行为在调整大小期间保持场景位置不变;调整大小时,视图的左上角将显示为锚定。
请注意,当只有场景的一部分可见时(即当有滚动条时),此属性的效果很明显。否则,如果整个场景适合视图,则使用视图将场景定位在视图中。

rubberBandSelectionMode:使用拖动模式时如何选择项目。
默认值为Qt::IntersectsItemShape ;形状与橡皮筋相交或由橡皮筋包含的所有项目都将被选中。

sceneRect:视图可视化的场景区域。
场景矩形定义场景的范围,在视图的情况下,这意味着可以使用滚动条导航的场景区域。
如果未设置,或者设置了 null QRectF,则此属性具有与 QGraphicsScene::sceneRect相同的值,并且随 QGraphicsScene::sceneRect更改。否则,视图的场景矩形不受场景的影响。
请注意,尽管场景支持几乎无限的大小,但滚动条的范围永远不会超过整数(INT_MIN、INT_MAX)的范围。当场景大于滚动条的值时,可以选择使用translate()来导航场景。
默认情况下,此属性在原点包含一个宽度和高度为零的矩形。

transformationAnchor:视图在变换期间应如何定位场景。
QGraphicsView使用此属性可以决定在变换矩阵更改和视图的坐标系变换时如何在视口中定位场景。默认为 AnchorViewCenter,可确保视图中心的场景点在变换期间保持不变(例如,旋转时,场景将显示为围绕视图中心旋转)。

viewportUpdateMode:视区应如何更新其内容。
QGraphicsView使用此属性可以决定如何更新已重新曝光或更改的场景区域。通常不需要修改此属性,但在某些情况下,这样做可以提高呈现性能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值