如何在QtGui / QGuiApplication中使用QGraphicsScene?

时间:2014-01-22 19:52:22

标签: qt qgraphicsscene

我用QtCreator创建了一个新的Qt 5项目,并添加了以下几行。

#include <QGraphicsScene>

//在main()中:
QGraphicsScene scene;

在.pro文件中我添加了:
 Qt += gui

QGraphicsScene的对象创建导致分段错误。 我错过了什么?

编辑:


我现在意识到,我的其他程序使用QApplication代替QtGui/QGuiApplication

如何在QtGui / QGuiApplication中使用QGraphicsScene?

1 个答案:

答案 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渲染到任意绘图设备中是微不足道的,而无需在屏幕上实际显示它。