我是 QT 库的新手,我想知道 QPainter 和 QGraphicsScene 之间的区别。
根据我看到带有 QPainter 的 voidrealms 视频的理解 和 QGraphicsView + QGraphicsScene两者都可以画出复杂的 二维对象。
主要区别在于后者有一个任意大的场景,我们可以通过一个“窗口”(我相信 Qt 的人称之为视口(viewport)?)并且这个场景可以用侧边栏滚动。还有我们 可以与在 GraphicsView 小部件中绘制的图形进行交互,比如使用鼠标,但在 QPainter 中我们不能。
这是正确的吗?
我们在什么情况下使用QPainter,什么时候使用QGraphicsScene+QGraphicsView?我主要对制作计算几何中某些算法的动画感兴趣,所以我似乎会使用后者。
我正在使用 Qt5.6。
最佳答案
QGraphicsItem
本身使用 QPainter
进行绘图,因此您的问题格式不正确。
Qt 为图形提供了 3 种不同的 API - 基于 QWidget
、基于 QGraphicsScene
堆栈和基于 QtQuick
。
QWidget
用于“典型的”GUI 矩形元素、按钮、复选框、下拉菜单等等。小部件是 QObject
派生的,因此您可以获得信号/插槽等。它是典型用户界面项目的最佳选择,而不是自定义图形,尽管它们仍然完全有可能实现。
QGraphicsScene
顾名思义,就是一个图形场景,可以滚动、缩放、旋转场景,场景和 View 是独立的对象,绘图本身和widgets是一样的,但是范式不是典型的小部件“绘制 GUI”,QGraphicsItem
本身也不是 QObject
派生的,因此您没有信号/插槽等,尽管您可以如果需要,请使用 QGraphicsObject
。常规图形项目更轻巧,支持 LOD 绘图和一些不属于小部件 API 的额外功能。有一些库存图形项目,例如线条、矩形等等,类似于库存小部件,对于所有自定义内容,您必须使用 QPainter
实现您自己的绘画,就像使用小部件一样。由于更轻巧且支持 LOD,您可以拥有比小部件多得多的对象数。
QtQuick
是最新的图形 API,从 Qt5 开始可用,它使用 QML 而不是 C++,并且在其中开发和制作原型(prototype)非常容易和快速。使用 QML 实现动画和自定义图形元素是最快和最容易的。它可以使用自定义 C++ 类型进行扩展,包括图形项,使用 QPainter
或 QML scenegraph API,后者的扩展稍微复杂一些。您还有一个 Canvas
元素,它有一个类似于 QPainter
的 API,您可以直接使用它。这个 API 比图形场景更重,因为额外的功能甚至比小部件更重,但是由于场景图,图形性能通常比小部件或图形场景好得多,即使你将它们与 OpenGL 结合。
关于c++ - 使用 QPainter 和 (QGraphicsView + QGraphicsScene) 绘图之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36389717/