2013-10-24 103 views
1

我有幾個對話框和按鈕來調用這些對話框。但是,每次點擊按鈕都會調用一個新的對話窗口。我希望現有的窗口先關閉,然後用戶可以點擊按鈕打開另一個窗口。Qt運行單一應用程序

下面是調用插槽的按鈕示例。每當我點擊按鈕時,它都會調用對話窗口的副本。有沒有辦法只調用對話窗口的一個副本?

謝謝。

Bookmark.cpp:

Bookmark::Bookmark() 
{ 
    createButtons(); 
    connect(bookmarkButton, SIGNAL(clicked()), this, SLOT(openBookmarkDlg())); 
} 

void Bookmark::createButtons() 
{ 
    ... 

    bookmarkButton = new QToolButton; 
    bookmarkButton->setText("Bookmark"); 
    addWidget(bookmarkButton); 

    ... 
} 

void Bookmark::openBookmarkDlg() 
{ 
    BookmarkDlg *bkDlg = new BookmarkDlg; 
    bkDlg->show(); 
} 

Bookmark.h:

class Bookmark : public QToolBar 
{ 
    Q_OBJECT 

public: 
    Bookmark(void); 
    ~Bookmark(void); 

public slots: 
    void openBookmarkDlg(); 

private: 
    createButtons(); 
    QToolButton *bookmarkButton; 
}; 
+1

只是不在'Bookmark :: openBookmarkDlg()中創建對話框的另一個實例'' –

+0

@DmitrySazonov:謝謝。我將'new'語句移到我的構造函數中,現在它只打開對話窗口的一個實例。我也編輯了'show()'到'exec()'。 – Wallace

+0

@Wallace如果我的回答很有幫助,請投票。如果它解決了您的問題,請點擊附近的複選框。通過做這些事情你會幫助未來的遊客。 – karlphillip

回答

0

如果你想在對話框窗口模式,即應用程序不接受外界的對話框中,使用用戶輸入對話框的window modality

但是請注意,模態窗口可能是真的惱人的用戶。

+0

謝謝。我將來也需要這樣做。我現在的問題是我正在尋找更多關於如何運行對話窗口的單個實例。 – Wallace

0

如果BookmarkDlg繼承了QDialog你可以做到以下幾點:

void Bookmark::openBookmarkDlg() 
{ 
    BookmarkDlg *bkDlg = new BookmarkDlg; 

    prepareYourDialog(bkDlg); 

    /*If you expect to do something when the dialog is accepted*/ 
    if (bkDlg->exec() == QDialog::Accepted) 
    { 
     /*Do something after dialog was accepted, and nothing when canceled*/ 
    } 

    delete bkDlg; 
} 
0

轉換BookmarkDlg *bkDlg到類的變量成員,而不是方法局部變量:

private: 
    createButtons(); 
    QToolButton *bookmarkButton; 
    BookmarkDlg *bkDlg; 

然後關於課程的實施,你可以這樣做:

void Bookmark::openBookmarkDlg() 
{ 
    if (!bkDlg) 
     bkDlg = new BookmarkDlg; 

    bkDlg->show(); 
}