【问题标题】:Difference between drawing with QPainter and (QGraphicsView + QGraphicsScene)用 QPainter 和 (QGraphicsView + QGraphicsScene) 绘图的区别
【发布时间】:2016-07-23 05:32:45
【问题描述】:

我是 QT 库的新手,我想知道 QPainter 和 QGraphicsScene 之间的区别。

据我了解,通过QPainter 观看 voidrealms 视频 和QGraphicsView + QGraphicsScene一起你可以画复杂的 二维对象。

主要区别在于后者有一个任意大的场景,我们通过“窗口”查看(我相信 Qt 的人称之为视口?)并且这个场景可以用侧边栏滚动。还有我们 可以与在 GraphicsView 小部件中制作的绘图进行交互,比如用鼠标,但在 QPainter 中我们不能。

这是正确的吗?

我们在什么用例中使用QPainter,什么时候使用QGraphicsScene+QGraphicsView?我主要对在计算几何中制作一些算法的动画感​​兴趣,所以我似乎将使用后者。

我正在使用 Qt5.6。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    QGraphicsItem 本身使用QPainter 进行绘图,因此您的问题格式不正确。

    Qt 为图形提供了 3 种不同的 API——基于QWidget、基于QGraphicsScene 堆栈和基于QtQuick

    QWidget 用于“典型”GUI 矩形元素、按钮、复选框、下拉菜单等。小部件是QObject 派生的,因此您可以获得信号/插槽等。它最适合典型的用户界面项目,而不是自定义图形,尽管它们仍然完全可以实现。

    QGraphicsScene顾名思义,是一个图形场景,可以滚动、缩放、旋转场景,场景和视图是分开的对象,绘制本身和widget是一样的,但是范式不是典型的小部件“绘制 GUI”,QGraphicsItem 本身也不是 QObject 派生的,因此您没有信号/插槽等,尽管您可以在需要时使用 QGraphicsObject。常规图形项更轻量级,支持 LOD 绘制和一些不属于小部件 API 的额外功能。有一些库存图形项目,例如线条、矩形等,类似于库存小部件,对于所有自定义内容,您必须使用QPainter 实现自己的绘画,就像使用小部件一样。由于更轻量级并支持 LOD,因此您可以拥有比小部件多得多的对象数。

    QtQuick 是自 Qt5 以来可用的最新图形 API,它使用 QML 而不是 C++,并且在其中开发和原型非常容易和快速。使用 QML 实现动画和自定义图形元素是最快和最容易的。它可以使用自定义 C++ 类型进行扩展,包括图形项,可以使用 QPainter 或 QML 场景图 API,后者的扩展稍微复杂一些。你还有一个Canvas 元素,它有一个类似于QPainter 的API,你可以直接使用它。这个 API 比图形场景更重,甚至比小部件更重,因为它有额外的功能,但是多亏了场景图,图形性能通常比小部件或图形场景好得多,即使你将它们与 OpenGL 结合使用。

    【讨论】:

    • LOD 代表细节级别 - 当对象变小时,您使用更快的绘制例程来绘制不太详细的对象
    • @ddriver 你能指出QGraphicsItem 中有关LOD 的一些信息吗?我可以看到QStyleOptionGraphicsItem::levelOfDetailFromTransform(wxform)QGraphicsScene::minimumRenderSize() 一起使用,但是当LOD 超过某些阈值时,我看不到任何方式让图形项得到通知(因此它可以改变它的绘制方式)。或者您会在项目的paint() 方法中调用levelOfDetailFromTransform,然后说if (lod < 0.5) ... else ...
    • @Schollii - 看一下芯片示例,它实现了 LOD:doc.qt.io/qt-5/qtwidgets-graphicsview-chip-example.html
    • @ddriver 谢谢,确实Chip::paint 方法使用在QStyleOptionGraphicsItem 实例上调用levelOfDetailFromTransform() 的返回值作为paint() 的参数,太棒了!对于其他对此感兴趣的人,这一切都在Chip.cpp specifically
    【解决方案2】:

    QPainter 可让您操作小部件上的像素。 QGraphicsView 在内部使用它来渲染场​​景的内容。如果您在场景中使用任何自定义项目,则必须编写自己的渲染代码,使用QPainter 来渲染它们。图形场景框架让您可以管理项目树中的几何图形,并提供对项目的轻松操作。不管你做什么,它仍然总是QPainter 做绘图。如果您的几何图形很简单或不需要交互和/或分层,请直接使用QPainter。否则,请使用图形场景或 QML 的场景几何,然后通过 OpenGL 渲染。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 2011-08-21
      • 2012-10-03
      • 2017-02-16
      • 2013-11-19
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多