你是正確的:與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()
訪問。解決方法是門衛qApp
與類型檢查參考scene_list
:
if (qobject_cast<QApplication*>(qApp))
您在這兩個QGraphicsScenePrivate::init()
和QGraphicsScene::~QGraphicsScene()
需要這個。我已經證實,在你重新編譯Qt之後,它不會再崩潰了。
如果你認真對待它,你必須從Qt的源文件中複製相關文件到你的項目中,從項目文件中刪除widgets
模塊,並修補它們直到它們工作。我個人認爲這是浪費精力。將QGraphicsView
渲染到任意繪畫設備中並不需要實際將其顯示在屏幕上,這是微不足道的。