我是QT库的新手,我想知道QPainter和QGraphicsScene之间的区别。
据我所知,通过看QPainter和QGraphicsView + QGraphicsScene的voidrealm视频,你可以画出复杂的2d对象。
主要的区别在于后者有一个任意大的场景,我们可以通过一个“窗口”(我相信Qt的人称之为viewport?)来查看,并且这个场景可以通过侧边栏滚动。我们还可以与GraphicsView小部件中的绘图进行交互,比如用鼠标,但在QPainter中我们不能。
是这样吗?
我们在什么情况下使用QPainter,什么时候使用QGraphicsScene+QGraphicsView?我主要对计算几何中的一些算法的动画感兴趣,所以看起来我将使用后者。
我正在使用Qt5.6。
3条答案
按热度按时间kcrjzv8t1#
QGraphicsItem
本身使用QPainter
进行绘图,因此您的问题格式不正确。Qt为图形提供了3种不同的API-基于
QWidget
,基于QGraphicsScene
堆栈和基于QtQuick
。QWidget
用于“典型”GUI矩形元素,按钮,复选框,下拉菜单等。小部件是QObject
派生的,因此您可以获得信号/插槽等。它是典型用户界面项目的最佳选择,而不是自定义图形,尽管它们仍然完全可以实现。QGraphicsScene
顾名思义,是一个图形场景,你可以滚动,缩放,旋转场景,场景和视图是独立的对象,绘图本身与小部件相同,但范例不是典型的小部件“绘制GUI”,而且QGraphicsItem
本身不是QObject
派生的,所以你没有信号/插槽等,虽然你可以使用QGraphicsObject
,如果你需要他们。常规的图形项更轻量级,支持LOD绘制和一些额外的功能不是widgets API的一部分。有一些股票图形项,如线条,矩形和诸如此类的东西,类似于如何有股票widgets,为一切自定义,你必须使用QPainter
来实现你自己的绘画,就像使用widget一样。由于更轻量级并且支持LOD,你可以拥有比widget高得多的对象数。QtQuick
是最新的图形API,自Qt 5以来可用,它使用QML而不是C++,并且在其中开发和原型非常容易和快速。动画和自定义图形元素是最快和最容易使用QML实现的。它可以使用自定义C++类型进行扩展,包括图形项目,使用QPainter
或QML scenegraph API,后者扩展起来稍微复杂一点。你还有一个Canvas
元素,它有一个类似于QPainter
的API,你可以直接使用。这个API比图形场景更重,甚至比小部件更重,因为额外的功能,但是多亏了scenegraph,图形性能通常比窗口小部件或图形场景好得多,即使您将它们与OpenGL结合使用。enxuqcxy2#
QPainter
让你可以操作窗口小部件上的像素。QGraphicsView
在内部使用它来渲染场景的内容。如果你在场景中使用任何自定义项目,你必须编写自己的渲染代码,使用QPainter
来渲染它们。图形场景框架让你可以在一个项目树中管理你的几何体,并提供了对项目的轻松操作。无论您做什么,它仍然总是QPainter
进行绘制。如果您的几何简单或不需要交互和/或分层,请直接使用QPainter
。否则,请使用图形场景,或QML的场景几何体,然后通过OpenGL渲染。w41d8nur3#
QGraphicView提供你制作类似剧院的东西。项目是演员,可以由Qt提供的预定义的图纸和项目组成,或者你需要QPainter来绘制的自定义项目。存储和管理所有项目和视图的场景是场景使用的容器/背景。这是你从这个框架中得到的力量。事实上,真实的的功能来自所有这些抽象类,你可以用它来使一切custome为您的usecases. Qpainter只能给予你的可能性,画一个项目,并显示在一些QpaintingDevice与使用一些功能,引擎给你.