2014-01-22 25 views
0

我用QtCreator創建了一個新的Qt 5項目,並在其中添加了以下幾行。如何使用QGraphicsScene與QtGui/QGuiApplication?

#include <QGraphicsScene>

//在main():
QGraphicsScene scene;

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

QGraphicsScene的對象的創建導致段故障。 我錯過了什麼?

編輯:


我意識到現在是不是QApplication我的程序的其餘部分使用QtGui/QGuiApplication

如何使用QGraphicsScene與QtGui/QGuiApplication?

回答

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()訪問。解決方法是門衛qApp與類型檢查參考scene_list

if (qobject_cast<QApplication*>(qApp)) 

您在這兩個QGraphicsScenePrivate::init()QGraphicsScene::~QGraphicsScene()需要這個。我已經證實,在你重新編譯Qt之後,它不會再崩潰了。

如果你認真對待它,你必須從Qt的源文件中複製相關文件到你的項目中,從項目文件中刪除widgets模塊,並修補它們直到它們工作。我個人認爲這是浪費精力。將QGraphicsView渲染到任意繪畫設備中並不需要實際將其顯示在屏幕上,這是微不足道的。

相關問題