2016-07-11 53 views
1

我有一個Qt Widgets應用程序,在Qt-Creator中創建和編輯。爲什麼推薦的QDialog實例化是這樣的?

主窗口(MainWindow類)有一個菜單欄,用一個按鈕打開一個小對話框(帶有文本或小部件的設置)。

要創建一個新的「窗口」,我打開Qt-Creator中的「創建新文件」對話框,並選擇Qt設計器窗體類,它創建所需的頁眉,源文件和ui文件(dialogabout.h,dialogabout.cpp ,dialogabout.ui)。

如果我與docs跟着一起,然後我打開了QDialog像這樣:

QDialog * widget = new QDialog; 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

這工作,但如果我修改新的對話框的初始化程序的按鈕連接到關閉信號,連接語句(以及其中的任何其他代碼)永遠不會到達。

DialogAbout::DialogAbout(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::DialogAbout) 
{ 
    ui->setupUi(this); 

    qDebug() << "I'm alive!"; // No output happens 
    connect(ui->pushButton_close, SIGNAL(clicked(bool)), this, SIGNAL(please_close())); // No signal created on pushbutton click. 
} 

我懷疑這是因爲我沒有明確地做過widget = new DialogAbout(this)。如果我用不同的方式實例化新對話框:

DialogAbout * newwindow; 
newwindow = new DialogAbout(this); 
newwindow->exec(); 

然後connect語句和qDebug工作。

我的問題是:偏離文檔推薦的創建對話框的方式有哪些缺陷?有沒有辦法使用之前的實例化方法來獲得此功能?

+0

please_close()是一個信號還是一個SLOT? – rflobao

回答

1

請注意,DialogAbout與Ui :: DialogAbout不同。 Ui :: DialogAbout是放置在UI命名空間中的一類構建,由uic自動創建。在你的項目中,這個文件的名字應該是「ui_dialogabout h」。

class Ui_DialogAbout 
{ 
public: 
    QPushButton *pushButton_close; 

    void setupUi(QDialog *DialogAbout) 
    { 
     ... 
    } // setupUi 

    void retranslateUi(QDialog *DialogAbout) 
    { 
     ... 
    } // retranslateUi 

}; 
namespace Ui { 
    class DialogAbout: public Ui_DialogAbout {}; 
} // namespace Ui 

這裏您使用了一個類QDialog,並使用Ui :: DialogAbout在其中構建佈局。請注意,Ui :: DialogAbout具有在QDialog中創建組件的功能。

QDialog * widget = new QDialog; 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

如果你專注了QDialog的DialogAbout你的代碼應該是這樣的:

DialogAbout * widget = new DialogAbout(); 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

但作爲setupUi()已經是中DialogAbout,你不能再打電話,結果:

DialogAbout * widget = new DialogAbout(); 
widget->exec(); 
+0

謝謝你爲我清理。我現在看到如何用任何一種方法獲得相同的功能。 – ctag

相關問題