2012-10-29 37 views
16

[ヘルプ] - > [アプリケーションについて]メニューから呼び出された簡単な「情報」モーダルダイアログを作りたいと思います。 QT Creator(.uiファイル)でモーダルダイアログウィンドウを作成しました。Qtは、メニュー項目のクリックでモーダルダイアログ(.ui)を表示します。

メニューの[About]スロットにはどのようなコードが必要ですか?

今私はこのコードを持っているが、それは新しいモーダルダイアログ(私のabout.uiに基づいていない)までを示しています。

void MainWindow::on_actionAbout_triggered() 
{ 
    about = new QDialog(0,0); 
    about->show(); 
} 

感謝を!

答えて

26

.uiファイルのUIを使用してダイアログをセットアップする必要があります。 Qt uicコンパイラは、コードに含める必要がある.uiファイルからヘッダファイルを生成します。 .uiファイルのファイル名がabout.uiで、ダイアログの名前がAboutであると仮定すると、uicはファイルui_about.hを作成し、クラスはUi_Aboutです。セットアップあなたのUIへの異なるアプローチが最も簡単で、あなたがより良いアプローチは、それがより良いあなたのダイアログをカプセル化するので、あなたは内の特定のダイアログに固有の機能を実装することができるように、継承を使用することです

#include "ui_about.h" 

... 

void MainWindow::on_actionAbout_triggered() 
{ 
    about = new QDialog(0,0); 

    Ui_About aboutUi; 
    aboutUi.setupUi(about); 

    about->show(); 
} 

を行うことができます、ありますサブクラス:

AboutDialog.h:

#include <QDialog> 
#include "ui_about.h" 

class AboutDialog : public QDialog, public Ui::About { 
    Q_OBJECT 

public: 
    AboutDialog(QWidget * parent = 0); 
}; 

AboutDialog.cpp:

AboutDialog::AboutDialog(QWidget * parent) : QDialog(parent) { 

    setupUi(this); 

    // perform additional setup here ... 
} 

使用法:いずれの場合で

#include "AboutDialog.h" 

... 

void MainWindow::on_actionAbout_triggered() { 
    about = new AboutDialog(this); 
    about->show(); 
} 

、重要コードがsetupUi()メソッドを呼び出すことです。

BTW:上記のコードのダイアログは非モーダルです。モーダルダイアログを表示するには、ダイアログのwindowModalityフラグをQt::ApplicationModalに設定するか、show()の代わりにexec()を使用します。

+0

ありがとう、アンドレアス!現時点では最も簡単な方法です...実際には、ui_about.hは作成されておらず、現在プリセットされていません。最初に指定したコードのプロジェクトはコンパイルされません。手動でui_about.hを作成する方法はありますか? –

+1

「uic about.ui -o ui_about.h」を使用して手動で作成することができます。しかし、あなたのビルドシステムはそれを世話するべきです。 'FORMS = about.ui'が' .pro'ファイルに含まれていることを確認してください。 –

+0

.proファイルに奇妙なエントリがありますか?しばらく前にリソースファイルが作成されないという同様の問題がありました:http://stackoverflow.com/questions/12380171/qmake-not-generating-binary-resource-files/12431570#12431570 –

4

モーダルダイアログでは、QDialogのexec()メソッドを使用する必要があります。

about = new QDialog(0, 0); 

// The method does not return until user closes it. 
about->exec(); 

// In this point, the dialog is closed. 

Docsは言う:

モーダルダイアログを表示するための最も一般的な方法は、そのexec()機能を呼び出すことです。ユーザーがダイアログを閉じると、exec()が有用な戻り値を提供します。


代替方法:あなたはモーダルダイアログを必要としません。ダイアログにモードレスを表示させ、そのaccepted()rejected()信号を適切なスロットに接続します。次に、show()の直後にコードを入れずに、スロットにすべてのコードを入れることができます。したがって、この方法では、モーダルダイアログは実際には必要ありません。

関連する問題