首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QtGui/QtGui应用程序中使用QGraphicsScene?

如何在QtGui/QtGui应用程序中使用QGraphicsScene?
EN

Stack Overflow用户
提问于 2014-01-22 19:52:21
回答 1查看 1.1K关注 0票数 1

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

#include <QGraphicsScene>

// in main():

QGraphicsScene scene;

在.pro文件中,我添加了:

Qt += gui

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

编辑:

现在我意识到,我的程序的其余部分使用的是QApplication,而不是QtGui/QGuiApplication

如何在QtGui/QtGui应用程序中使用QGraphicsScene?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-22 21:44:11

您是对的:在QT4.8和5.2中,QApplication都适用于我,但在QGuiApplication中不适用

代码语言:javascript
复制
#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的引用。

代码语言:javascript
复制
if (qobject_cast<QApplication*>(qApp))

QGraphicsScenePrivate::init()QGraphicsScene::~QGraphicsScene()中都需要这样做。我已经确认,在您重新编译Qt之后,它不再崩溃了。

如果您是认真的,您将不得不将相关文件从Qt的源复制到您的项目中,从项目文件中删除widgets模块,并修补这些文件,直到它们正常工作为止。就我个人而言,我认为这是在浪费精力。将QGraphicsView呈现到任意的画图设备中是很简单的,而不必在屏幕上实际显示它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21292617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档