2012-02-27 65 views
0

似乎每當我嘗試將一個qt對話框屏幕「存儲」到一個靜態變量中,程序就會崩潰。 (有一個調試錯誤,抱怨在QMainApplication之前無法創建QPaintDevice)。靜態qt對話窗口不可能?

由於這個錯誤發生在主循環被輸入之前,我把它當作是靜態變量的問題。 (嗯,這是我自上次構建以來唯一添加的)。

讓我先試着解釋我如何使用它。基本上我有一棵樹(源自一些外部的-xml文件)。我希望顯示那棵樹的數據。然而,根據樹中的實際位置,數據必須以不同的方式繪製。 (使用完全不同的對話框)。

所以我開始創建一個靜態地圖。這張地圖將樹的「位置」(「regexified」,比如「a * c d」 - 空格表示分支)保存爲關鍵字。作爲價值,應該指出正確的對話。

第一個想法是簡單地使用指向對話框的指針。 (然後查找變量的函數只是執行對話框屏幕)。然而這導致了上面顯示的錯誤。

現在我開始使用中間代理函數,其中函數只是創建對話框並調用它。而靜態地圖只是一個指向這個函數的指針。喜歡的東西:

int AskGUIFn::GenStd(const GMProject::pTree& tOut, const GMProject::pTree& tIn) const { 
    std::unique_ptr<MW::GenStd> box(new MW::GenStd(&tOut, &tIn)); 
    return box->exec(); 
} 

然而,這似乎非常詳細(不只是做我必須創建所有的模態窗口,但我必須添加其他代理功能爲每個對話屏幕)。有沒有更乾淨的方法來做到這一點?我想阻止使用代理功能?

+0

我相信在標題中的問題的答案是否定的,由於錯誤消息中給出的原因。我想知道爲什麼你不能只生產一個基於請求類型產生對話框的工廠? – kenrogers 2012-02-27 18:45:35

+0

@kenrogers以及問題是我喜歡用qt設計器來創建對話界面.. – paul23 2012-02-27 19:28:59

+0

這很好。您可以在設計器創建的對話框中調用「new MyCustomDialogX(...」)。 – kenrogers 2012-02-27 20:16:55

回答

3

靜態QWidgets是不可能的 - 必須在QWidget之前創建QApplication對象。另外,靜態變量的未定義初始化和破壞順序會導致麻煩。另外請注意,如果您有其他窗口可見(例如主窗口),則應始終將父項傳遞給模式對話框,否則窗口堆疊將在某些平臺上顯示惱人的行爲(禁用窗口後面的模式對話框等)。像kenrogers我建議使用工廠功能,如:

QDialog* createDialogForNodeType(const QString& type, ...tree data, QWidget* parent);