2016-07-11 5 views
1

Qt-Creatorで作成して編集したQtウィジェットアプリケーションがあります。QDialogの推奨インスタンシエーションは、どうしてですか?

メインウィンドウ(MainWindowクラス)にはメニューバーがあり、小さなダイアログ(設定用のテキストまたはウィジェット付き)を開くためのボタンがあります。

新しい「ウィンドウ」を作成するには、Qt-Creatorで「新規ファイルの作成」ダイアログを開き、必要なヘッダー、ソース、およびuiファイルを作成するQt Designer Form Classを選択します(dialogabout.h、dialogabout.cpp 、dialogabout.ui)。

私はdocsと一緒に従うならば、私はそのようにようQDialogを開く:

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

これは動作しますが、私は新しいダイアログのインスタンシを変更した場合に近い信号へのプッシュボタンを接続するには、connect文を(他のコードと一緒に)決して到達されません。

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()はSIGNALまたはSLOTですか? – rflobao

答えて

1

DialogAboutはUi :: DialogAboutと同じではありません。 Ui :: DialogAboutは、UI名前空間に配置されたビルドのクラスで、uicによって自動的に作成されます。あなたのプロジェクトでは、このファイルの名前は "ui_dialogabout h"にする必要があります。

ここではクラスQDialogを使用し、Ui :: DialogAboutを使用してレイアウトを作成します。 Ui :: DialogAboutには、QDialogでコンポーネントを作成する関数があることに注意してください。

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

あなたがDialogAboutためQDialogを専門とした場合、あなたのコードは次のようになります。

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

しかしsetupUiは()DialogAbout以内すでにあるとして、あなたは、その結果、再び呼び出すことはできません。

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

私のためにそれをクリアしていただきありがとうございます。私は今どちらの方法でも同じ機能を得る方法を見ています。 – ctag

関連する問題