我是QT库的新手,我想知道QPainter和QGraphicsScene之间的区别。
根据我的理解,通过QPainter查看voidrealms视频 并且使用QGraphicsView + QGraphicsScene两者都可以画出复杂的 2d对象。
后者的主要区别是有一个任意大的场景我们通过“窗口”查看(我相信Qt家伙称之为视口?)并且这个场景可以用侧边栏滚动。我们也是 可以与GraphicsView小部件中的图形交互,比如使用鼠标,但在QPainter中我们不能。
这是对的吗?
在什么用例中我们使用QPainter,何时使用QGraphicsScene + QGraphicsView?我主要想在计算几何中制作一些算法的动画,所以我似乎将使用后者。
我使用的是Qt5.6。
答案 0 :(得分:14)
QGraphicsItem
本身使用QPainter
进行绘制,因此您的问题格式不正确。
Qt为图片提供了3种不同的API - 基于QWidget
,QGraphicsScene
基于堆栈和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渲染。