2012-09-16 129 views
0

如何檢查窗口/對話框是否已打開?我用這段代碼打開一個新的對話框,但每次點擊它時,對話框都會一直打開。顯然不是方式設置對話框工作。Qt - 打開窗口的單個實例

Class *someClass = new Class(); 
someclass->show(); 

回答

1

在您的代碼中,您每次創建一個新的窗口/小部件/對話框。 在其他地方初始化*someClass,然後只顯示它。

class Foo 
{ 
public: 
    Foo() { someClass = new SomeClass() } 
    void fooClicked() { someClass->show() } 

private: 
    SomeClass *someClass; 
}; 
+0

我這個APPR同意oach。雖然將someClass初始化爲0,並只在需要時才創建它。如果someClass不爲null,可能需要在fooClicked()中調用raise()。 –

+0

它給了我錯誤LOADS如果我使用此代碼: https://dl.dropbox.com/u/11701729/Code.txt – Fahmid

+0

向我們顯示這些錯誤將是有益的......但你可能已經有'MainWindow :: mainWindow.cpp中的MainWindow(QWidget *)'。另外,什麼是'設置'? – lukad

1

使用QPointer:

QPointer<MyDialog> dialog = new MyDialog(this); 
dialog->show(); 
... 
if (dialog) dialog->show(); 

如果存在對話框就會顯示出來。如果在此期間被刪除,它將保留0而不是無效地址,並且最後一行永遠不會被執行 - 它不會被顯示,但是如果需要可以重新創建它。

0

你可以在你的窗口類上創建一個靜態指針。它允許您存儲上次打開的窗口對象。

class MyWindow : public QWidget { 
    public : 
    static MyWindow* instance; 

    ... 
} 

無論何時您創建新實例,您都可以設置instance。當實例爲空時,您可以創建一個新窗口。當你想關閉打開的窗口時,你應該再次創建實例null。這允許您只有一個打開的窗口。

if (MyWindow::instance == NULL) { 
    MyWindow *w = new MyWindow(...); 
    MyWindow::instance = w; 
} 

這種設計模式被稱爲Singleton,它允許每個類只有一個對象。此外,這有點不同,因爲在Singleton中,構造函數不是public的,工廠方法應該用於製作對象,但它是相似的。

+0

對我來說,看起來不是很優雅也不靈活。爲什麼當創建類中的(非靜態)成員變量工作的時候,把某些東西變成單身?如果您想要有多個對話實例(但不一定在給定的上下文中),該成員也可以工作。 –

+0

正如我所說,它不是Singleton。這是這樣的。這個實現不會強制你只有一個對象。而且,靜態指針可以在類之外。但我同意你的看法。當局部變量足夠時,不應使用靜態變量。 –

1

在您的調用類(或主應用程序類,或者類似的東西)定義一個指針類:

dialogclass *someclass; 

在該主類的構造函數,初始化對話框類:

someclass = NULL; 

當你想要顯示的對話框中,執行這些方針的東西:

if (!someclass) someclass = new dialogclass(); // Creates a dialog instance if it does not already exist 
if (!someclass->isVisible()) someclass->show(); // Only shows the dialog if it is not already shown.