我用QtCreator创建了一个新的Qt 5项目,并在其中添加了以下行。
#include <QGraphicsScene>
// in main():
QGraphicsScene scene;
在.pro文件中,我添加了:
Qt += gui
QGraphicsScene的对象创建导致了分割错误。我错过了什么?
编辑:
现在我意识到,我的程序的其余部分使用的是QApplication,而不是QtGui/QGuiApplication。
如何在QtGui/QtGui应用程序中使用QGraphicsScene?
发布于 2014-01-22 21:44:11
您是对的:在QT4.8和5.2中,QApplication都适用于我,但在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呈现到任意的画图设备中是很简单的,而不必在屏幕上实际显示它。
https://stackoverflow.com/questions/21292617
复制相似问题