一、描述

QGraphicsView在可滚动视口中可视化 QGraphicsScene 的内容。例:

     QGraphicsScene scene;scene.addText("Hello, world!");QGraphicsView view(&scene);view.show();

视图可用于可视化整个场景,或仅可视化其中的一部分。默认情况下,在第一次显示视图时会自动检测可视化区域(通过调用 QGraphicsScene::itemsBoundingRect())。要自己设置可视化区域矩形,可以调用 setSceneRect()。这将适当地调整滚动条的范围。请注意,尽管场景支持几乎无限大小,但滚动条的范围不会超过整数范围(INT_MININT_MAX)。

可以使用鼠标和键盘与场景中的项目进行交互。 QGraphicsView将鼠标和按键事件转化为场景事件,并转发到可视化的场景中。

二、类型成员

1、QGraphicsView::CacheModeFlag:视图的缓存模式。视图可以在 QPixmap 中缓存预渲染的内容,然后将其绘制到视口上。这种缓存的目的是加快渲染速度较慢的区域的总渲染时间。例如,纹理、渐变和 alpha 混合背景的渲染速度可能非常慢,尤其是转换后的视图。 每次转换视图时,缓存都会失效。滚动时,只需要部分失效。

  • CacheNone:不缓存,所有绘制都直接在视口上完成。
  • CacheBackground:启用缓存背景。

2、QGraphicsView::DragMode:在视口上按下并拖动鼠标时视图的默认操作。

  • NoDrag:无拖拽,鼠标事件被忽略。
  • ScrollHandDrag:光标变为指向手型,拖动鼠标将滚动滚动条。 此模式在交互和非交互模式下均可使用。

  • RubberBandDrag:会出现一个橡皮筋框。拖动鼠标将设置橡皮筋框范围,所有被橡皮筋覆盖的项目都会被选中。对于非交互式视图禁用此模式。

3、QGraphicsView::OptimizationFlag:可以启用以提高视图渲染性能的标志。默认情况下,没有设置这些标志。设置标志通常会产生副作用,并且此效果可能在绘画设备和平台之间有所不同。

  • DontSavePainterState:渲染时,视图会在渲染背景或前景以及渲染每个图形项时保存画家状态(QPainter::save())。
  • DontAdjustForAntialiasing:禁用视图对暴露区域的抗锯齿自动调整。在QGraphicsItem::boundingRect() 边界上呈现抗锯齿线的图形项最终可能会在外部呈现部分线条。为了防止呈现伪像,视图将所有暴露区域在所有方向上扩大2个像素。 如果启用此标志,视图将不再执行这些调整,从而最小化需要重绘的区域,从而提高性能。一个常见的副作用是使用抗锯齿绘制的项目在移动时会在场景中留下绘画痕迹。

4、QGraphicsView::ViewportAnchor:当用户调整视图大小或转换视图时视图可以使用的锚点。

  • NoAnchor:没有锚点,即视图使场景的位置保持不变。
  • AnchorViewCenter:视图中心的场景点用作锚点。
  • AnchorUnderMouse:鼠标下方的点用作锚点。

5、QGraphicsView::ViewportUpdateMode:场景内容更改时如何更新视口。

  • FullViewportUpdate:当场景的任何可见部分发生变化或重新曝光时,视图将更新整个视口。这是不支持部分更新的视口(例如 QOpenGLWidget)以及需要禁用滚动优化的视口的首选更新模式。
  • MinimalViewportUpdate:视图将确定需要重绘的最小视区区域,通过避免重绘未更改的区域来最小化绘制时间。 这是视图的默认模式。虽然这种方法总体上提供了最好的性能,但如果场景中有许多小的可见变化,视图最终可能会花费更多的时间来寻找最小化区域的方法而不是绘制。
  • SmartViewportUpdate:视图将尝试通过分析需要重绘的区域来寻找最佳更新模式。
  • BoundingRectViewportUpdate:将重新绘制视口中所有更改的边界矩形。这种模式的优点是视图只搜索一个区域的变化,最大限度地减少确定需要重绘什么的时间。缺点是没有改变的区域也需要重新绘制。
  • NoViewportUpdate:视图永远不会在场景改变时更新它的视口,用户应控制所有更新。此模式禁用视图中的所有(可能很慢)图形项可见性测试,适用于需要固定帧速率或视口以其他方式从外部更新的场景。

三、属性成员

1、alignment : Qt::Alignment

当整个场景可见时(即没有可见的滚动条(视图范围 >= 场景范围)),此属性保持视图中场景的对齐方式。对齐方式将决定场景在视图中的渲染位置。例如,如果对齐方式是Qt::AlignCenter,这是默认的,场景将在视图中居中,如果对齐方式是(Qt::AlignLeft | Qt::AlignTop),场景将在顶部渲染 - 视图的左角。

2、backgroundBrush : QBrush

此属性保存场景的背景画刷。它用于覆盖场景自身的背景。要为视图提供自定义背景绘图,可以改为重新实现 drawBackground()。默认为 Qt::NoBrush 模式的画刷。

3、cacheMode : CacheMode

缓存背景模式。如:

     QGraphicsView view;view.setBackgroundBrush(QImage(":/images/backgroundtile.png"));view.setCacheMode(QGraphicsView::CacheBackground);

4、dragMode : DragMode

5、foregroundBrush : QBrush

此属性保存场景的前景画刷。它用于覆盖场景自身的前景。要为视图提供自定义前景绘图,可以改为重新实现drawForeground()。默认为Qt::NoBrush模式的画刷。

6、interactive : bool

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

7、optimizationFlags : OptimizationFlags

8、renderHints : QPainter::RenderHints

这些提示用于在绘制每个可见图形项之前初始化QPainter。默认情况下启用QPainter::TextAntialiasing。例:

     QGraphicsScene scene;scene.addRect(QRectF(-10, -10, 20, 20));QGraphicsView view(&scene);view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);view.show();

9、resizeAnchor : ViewportAnchor

调整视图大小时,视图应如何定位场景。

10、rubberBandSelectionMode : Qt::ItemSelectionMode

使用橡皮筋框选择矩形选择图形项的行为。具体值见:QGraphicsScene详解 第42个成员函数。

11、sceneRect : QRectF

视图可视化的场景区域。如果未设置,或者如果设置了空 QRectF,则此属性与QGraphicsScene::sceneRect 具有相同的值,并随 QGraphicsScene::sceneRect 更改。否则,视图的场景矩形不受场景影响。

12、transformationAnchor : ViewportAnchor

视图在转换过程中应如何定位场景。

13、viewportUpdateMode : ViewportUpdateMode

三、成员函数

1、void invalidateScene(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = QGraphicsScene::AllLayers)

使场景中的矩形rect内的图层无效并安排重绘。rect内图层的任何缓存内容都将无条件地失效并重新绘制。

2、【信号】 void rubberBandChanged(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint)

当橡皮筋矩形改变时发出这个信号。橡皮筋矩形为rubberBandRect。参数2和参数3为拖动开始位置和拖动结束位置,都是场景中的点。当橡皮筋选择结束时,此信号将与空值一起发射。

3、void updateScene(const QList<QRectF> &rects)

立刻更新场景矩形。

4、void centerOn(const QPointF &pos)

滚动视口的内容以确保场景坐标pos在视图中居中。

5、void centerOn(const QGraphicsItem *item)

滚动视口的内容以确保图形项在视图中居中。

6、void drawBackground(QPainter *painter, const QRectF &rect)

默认调用场景的 drawBackground()。

7、void drawForeground(QPainter *painter, const QRectF &rect)

默认调用场景的 drawForeground()。使用 viewport()->update() 刷新内容。

8、void ensureVisible(const QRectF &rect, int xmargin = 50, int ymargin = 50)

滚动视口的内容使场景矩形rect可见,边距由 xmargin 和 ymargin 以像素为单位指定。 如果无法到达指定的矩形,则将内容滚动到最近的有效位置。

9、void ensureVisible(const QGraphicsItem *item, int xmargin = 50, int ymargin = 50)

滚动视口的内容使图形项可见。如果无法到达指定的图形项所在位置,则将内容滚动到最近的有效位置。

10、void fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)

缩放视图矩阵并滚动滚动条以确保场景矩形rect适合视口。rect必须在场景rect内,否则fitInView()不能保证整个矩形都是可见的。此函数只缩放和滚动滚动条但保持视图的旋转、平移或剪切。视图根据aspectRatioMode 进行缩放。

    gphv->fitInView(QRect(0,0,300,300));

11、void fitInView(const QGraphicsItem *item, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)

确保 item 紧密地适合视图,根据 aspectRatioMode 缩放视图。

12、QGraphicsItem * itemAt(const QPoint &pos)

返回位置 pos 处的图形项,pos在视口坐标中。如果此位置有多个图形项,则此函数返回最上面的图形项。

13、QList<QGraphicsItem *> items()

返回关联场景中所有图形项的列表,按堆叠顺序降序排列。

14、QList<QGraphicsItem *> items(const QPoint &pos)

返回视图中位置 pos 处所有图形项的列表。按堆叠顺序降序排列。pos在视口坐标中。

15、QList<QGraphicsItem *> items(const QRect &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)

包含在 rect 中或与 rect 相交的所有项目的列表。 rect 在视口坐标中。模式见:QGraphicsScene详解 第42个成员函数。项目按堆叠降序排序。

16、QList<QGraphicsItem *> items(const QPolygon &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)

重载函数。

17、QList<QGraphicsItem *> items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)

重载函数。

18、QPoint mapFromScene(const QPointF &point)

QPolygon mapFromScene(const QRectF &rect)

QPolygon mapFromScene(const QPolygonF &polygon)

QPainterPath mapFromScene(const QPainterPath &path)

场景坐标中的点、矩形、多边形、路径转换到视口坐标中的点、多边形、路径。

19、QPointF mapToScene(const QPoint &point)

QPolygonF mapToScene(const QRect &rect)

QPolygonF mapToScene(const QPolygon &polygon)

QPainterPath mapToScene(const QPainterPath &path)

视图坐标转场景坐标。

20、void render(QPainter *painter, const QRectF &target = QRectF(), const QRect &source = QRect(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)

使用painter将处于视图坐标中的 source 从场景渲染到处于绘制设备坐标中的 target 。如果 source 是一个空矩形,这个函数将使用viewport()->rect() 来确定要绘制的内容。 如果目标是空矩形,则将使用画家绘制设备的完整尺寸(例如,对于 QPrinter,页面大小)。源矩形内容将根据 aspectRatioMode 进行转换以适应目标矩形。 默认情况下,保持长宽比,并缩放源以适应目标。

此函数可用于将视图的内容捕获到绘图设备上,例如 QImage(例如,截取屏幕截图)或打印到 QPrinter。 例如:

 QGraphicsScene scene;scene.addItem(......QGraphicsView view(&scene);view.show();...QPrinter printer(QPrinter::HighResolution);printer.setPageSize(QPrinter::A4);QPainter painter(&printer);view.render(&painter);QRect viewport = view.viewport()->rect();view.render(&painter,QRectF(0, printer.height() / 2,printer.width(), printer.height() / 2),viewport.adjusted(0, 0, 0, -viewport.height() / 2));

21、void resetCachedContent()

重置所有缓存的内容。调用此函数将清除视图的缓存。

如果当前缓存模式为 CacheNone,则此函数不执行任何操作。当 backgroundBrushQGraphicsScene::backgroundBrush 属性更改时,会自动调用此函数。如果重新实现QGraphicsScene::drawBackground() 或 drawBackground() 来绘制自定义背景,并且需要触发完全重绘,则只需调用此函数。

22、void resetTransform()

将视图转换重置为单位矩阵。

23、void rotate(qreal angle)

顺时针旋转当前视图。

24、QRect rubberBandRect()

如果当前正在使用橡皮筋进行项目选择,则此函数返回当前橡皮筋区域(在视口坐标中)。当用户不使用橡皮筋时,此函数返回(空值)QRectF()。此 QRect 的一部分可以超出视觉视口,它可以包含负值。

25、void scale(qreal sx, qreal sy)

按 (sx, sy) 缩放当前视图。

26、void setTransform(const QTransform &matrix, bool combine = false)

设置视图的转换矩阵。参数2见QPainter详解的第46个函数。

27、void shear(qreal sh, qreal sv)

通过 (sh, sv) 剪切当前视图转换。剪切效果见QTransform的第22个函数。

28、void translate(qreal dx, qreal dy)

将当前视图转换转换为 (dx, dy)。

Qt图形视图框架:QGraphicsView 详解相关推荐

  1. Qt图形视图框架详解-安晓辉-专题视频课程

    Qt图形视图框架详解-12227人已学习 课程介绍         介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...

  2. Qt 图形视图框架(Qt MVC)

    什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离 ...

  3. Qt 图形视图框架中的事件处理和传播

    目录名字 Qt 图形视图框架中的事件处理和传播 要点: Qt 图形视图框架中的事件处理和传播 图形视图框架在一些动画类的应用程序上经常会用到.该框架中的事件处理与传播机制也是经常会涉及. 程序设计核心 ...

  4. Qt图形视图框架:QGraphicsScene详解

    一.描述 1.场景提供了一个用于管理大量2D图形项的平面.该类充当图形项的容器. 它与视图一起用于可视化2D曲面上的图形图形项. 2.场景没有自己的视觉外观,只负责管理图形项. 3.场景的最大优势之一 ...

  5. 201112阶段二qt图形视图框架

    目录 一.学习的知识点 一)事件 二)图形视图框架 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 一)事件 鼠标事件的创建 组合键 二)图形视图框架 场景类:坐标系以中心为 ...

  6. Qt图形视图框架图片图元QGraphicsPixmapItem

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/107.html 看这个标题还真有点拗口,一句话里出现了四个图字.这句话的关键词是图片,前面讲了 ...

  7. Qt图形视图框架--图元总结

    文章目录 一.基类QGraphicsItem 二.内部图元 2.1.椭圆图元--QGraphicsEllipseItem 2.2.线段图元--QGraphicsLineItem 2.3.路径图元--Q ...

  8. Qt图形视图框架:视图增加标尺

    效果: 把视图.水平标尺.垂直标尺用网格布局放置. 每当拖动视图的滚动条时,更新标尺的偏移量: connect(deviceGraphicsView->horizontalScrollBar() ...

  9. Qt图形视图框架:将自定义图形项放入布局

    只有继承布局项QGraphicsLayoutItem的对象才能放入布局.继承QGraphicsLayoutItem后需要重写setGeometry().sizeHint()这两个函数. 以自定义滑动条 ...

  10. QT图形视图框架---场景 advance()函数

    调用场景的advance()函数就会自动调用场景中所有图形项的advance()函数,

最新文章

  1. java 数组越界异常_数组越界异常 求解决!!!
  2. JGG:口腔微生物组助力妊娠糖尿病识别
  3. 理解Linux中断 (2)【转】
  4. 阿里云centos 6.5 32位安装可视化界面的方法
  5. struts深入原理之RequestProcessor与xml
  6. [转]Shared——回调函数是什么
  7. 21秋期末考试管理学基础10241k2
  8. LeetCode 6033. 转换数字的最少位翻转次数(位运算)
  9. 天下无难试之Redis面试刁难大全「原创」
  10. UDP编程与Socket
  11. php挑战答题,挑战答题小程序5.3.1开源
  12. macos显卡测试软件,GpuTest显卡测试软件 for Mac 64位
  13. 《手把手陪您学Python》24——集合
  14. 【MSFconsole进阶】evasion(免杀模块):免杀模块使用方法,相关设置
  15. python简易版成绩管理系统_Python学生成绩管理系统简洁版
  16. ABAP 计算汇率的方法
  17. 消费者洞察:数据化闭环洞察消费者
  18. 5g空分复用技术_【从零开始学5G】空分复用与Pre5G
  19. C/C++/SFML编写俄罗斯方块小程序 附代码和下载链接
  20. 【纪录】Proxychain4 使用部署以及利用 ss 加速下载操作

热门文章

  1. 程序员的人生——应届生北漂的第三天
  2. 【数据库】数据库课程设计一一疫苗接种数据库
  3. LDC 1.14.0 发布,高性能 dlang 编译器
  4. [py] 考拉兹猜想
  5. 逻辑上的“谬误”真的是我们应该所认为的错误吗?
  6. 阵列信号处理笔记-波达方向DOA-子空间方法
  7. java的开源软件jimi图片处理工具
  8. 全球及中国军用海岸雷达行业研究及十四五规划分析报告
  9. 整型和bcd的对应关系_微信与多闪之争背后,好友关系链到底是如何窃取的?
  10. CPU位数和DDR位宽