使用QPainter和(QGraphicsView + QGraphicsScene)进行绘图之间的区别

时间:2016-04-03 18:54:42

标签: c++ qt

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

根据我的理解,通过QPainter查看voidrealms视频 并且使用QGraphicsView + QGraphicsScene两者都可以画出复杂的 2d对象。

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

这是对的吗?

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

我使用的是Qt5.6。

2 个答案:

答案 0 :(得分:14)

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

Qt为图片提供了3种不同的API - 基于QWidgetQGraphicsScene基于堆栈和QtQuick

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

QGraphicsScene顾名思义,是一个图形场景,你可以滚动,缩放,旋转场景,场景和视图是单独的对象,绘图本身与小部件相同,但范式不是典型的小部件"绘制GUI",QGraphicsItem本身不是QObject派生的,所以你没有信号/插槽等等,尽管你可以使用{ {1}}如果你需要它们。常规图形项更轻量级,支持LOD绘图和一些不属于小部件API的额外功能。有一些库存图形项目,如线条,矩形等等,类似于库存小部件的方式,对于一切自定义,您必须使用QGraphicsObject实现自己的绘画,就像使用小部件一样。由于更轻量级和支持LOD,您可以拥有比小部件更高的对象数。

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

答案 1 :(得分:2)

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