我用QtCreator创建了一个新的Qt 5项目,并添加了以下几行。
#include <QGraphicsScene>
//在main()中:
QGraphicsScene scene;
在.pro文件中我添加了:
Qt += gui
QGraphicsScene
的对象创建导致分段错误。
我错过了什么?
编辑:
我现在意识到,我的其他程序使用QApplication
代替QtGui/QGuiApplication
。
如何在QtGui / QGuiApplication中使用QGraphicsScene?
答案 0 :(得分:1)
你是对的:使用QApplication
,它适用于Qt 4.8和5.2,但不适用于QGuiApplication
:
#include <QApplication>
#include <QGraphicsScene>
#include <QTimer>
int main(int argc, char ** argv) {
QApplication app(argc, argv);
// With QGuiApplication, QGraphicsScene constructor crashes.
QGraphicsScene scene;
QTimer::singleShot(1000, &app, SLOT(quit()));
return app.exec();
}
说明代码只使用添加到项目中的gui
模块进行编译是不正确的。如果没有widgets
模块,您的代码将无法编译,这应该是您尝试做一些不受支持的事情的第一个提示。
QGraphicsScene
不是gui
模块的一部分,而是widgets
模块的一部分!小部件模块中的所有类都可以自由地假设(并且它们确实!)您已实例化QApplication
,不是 QGuiApplication
!我已将其作为QTBUG-36413提交,但不出所料 - 它已被关闭为无效。它根本不应该工作。
如果您想使用QGuiApplication
,则有一种解决方法:
QApplication
(但不是QGuiApplication
)保留所有图形场景的列表。 QGraphicsScene
假定qApp
的类型为QApplication
。该列表在QGraphicsScenePrivate::init()
中访问。修复是通过scene_list
上的类型检查来保护对qApp
的引用:
if (qobject_cast<QApplication*>(qApp))
QGraphicsScenePrivate::init()
和QGraphicsScene::~QGraphicsScene()
都需要此功能。我已经确认,在重新编译Qt之后,它不会再崩溃了。
如果您认真对待它,则必须将相关文件从Qt源复制到项目中,从项目文件中删除widgets
模块,然后进行修补,直到它们工作为止。我个人认为这是浪费精力。将QGraphicsView
渲染到任意绘图设备中是微不足道的,而无需在屏幕上实际显示它。