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

标签 c++ qt

我是 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/

相关文章:

c++ - 初始化类的私有(private)成员变量

c++ - 当我使用 SDL 运行 C++ 程序时获取命令行

c++ - 自动更新软件; FTP 是一个好的选择吗?

c++ - 如何解决 Qt 中的这个设计障碍?

三重嵌套模板参数的 C++ 正确语法

qt - 当删除其中一个类时,Qt中的信号是否会自动断开

c++ - 编译 qt 项目给 operator delete(void*, unsigned int) undefined reference

c++ - Linux (Ubuntu 18) 上的按键模拟问题

c++ - QToolBar 改变高度

java - Qt Java - 从图库中获取图像