C++でQTアプリ(その9) ダイアログの作成
クラスQDialogを使ってダイアログ用サブウィンドウを作成してみる。クラスDlgはQDialogを継承、ボタンAccept、Reject、Closeを配置して各々同名のスロットでウィンドウを閉じるようにしている。またgetStatus関数によってCloseEventの発生を知ることができるようにしてみた。
ダイアログウィンドウはクラスDialogTest上のnewで新規ウィジェットを作成し、execで表示を行い結果を取得している。ちなみにダイアログはモーダルで作成している。
これでウィンドウの閉じ方による返り値とCloseEventの発生の有無を調べてみると以下の様な結果となる。
OK(右上):Accepted、CloseEventなし X(右上):Rejected、CloseEvent発生 Accept :Accepted、CloseEventなし Reject :Rejected、CloseEventなし Close :Rejected、CloseEvent発生
CloseEventはウィンドウを閉じる全ての場合に発生するものでは無いらしい。というかAcceptやRejectは実際にはウィンドウを閉じていない?
dialogtest.h
#ifndef DIALOGTEST_H #define DIALOGTEST_H #include <qmainwindow.h> #include <qvbox.h> #include <qmultilineedit.h> #include <qpushbutton.h> #include <qdialog.h> #include <qstring.h> class DialogTest : public QMainWindow{ Q_OBJECT public: DialogTest(QWidget *parent = 0, const char *name = 0); // ~DialogTest(); private: QVBox *v; QMultiLineEdit *eb; QPushButton *pb; private slots: void slot_openDialog(); }; class Dlg : public QDialog{ Q_OBJECT public: Dlg(QWidget * parent=0, const char * name=0, bool modal = FALSE, WFlags f = 0); // ~Dlg(); QString getStatus(); private: QPushButton *pb_a, *pb_r, *pb_c; QString status; private slots: void slot_accept(); void slot_reject(); protected: virtual void closeEvent( QCloseEvent *e ); }; #endif
dialogtest.cpp
#include "dialogtest.h" DialogTest::DialogTest(QWidget *parent, const char *name) : QMainWindow(parent, name) { setCaption("Dialog SubWindow Test"); v = new QVBox( this ); setCentralWidget( v ); eb = new QMultiLineEdit( v ); eb->clear(); pb = new QPushButton("Open Dialog", v ); connect( pb, SIGNAL(clicked()), this, SLOT(slot_openDialog()) ); } // ダイアログウィンドウ表示 void DialogTest::slot_openDialog() { Dlg *d = new Dlg( this, "", TRUE ); // modalでウィジェット作成 int i = d->exec(); // 表示、結果を取得 if( i == QDialog::Accepted ) eb->insertLine("Result : Accepted"); else if( i == QDialog::Rejected ) eb->insertLine("Result : Rejected"); else eb->insertLine("Result : Unknown"); eb->insertLine( d->getStatus() ); delete d; // ウィジェット削除 } // ダイアログウィンドウ用クラス Dlg::Dlg(QWidget *parent, const char *name, bool modal, WFlags f) : QDialog( parent, name, modal, f ) { setCaption("Dialog SubWindow"); resize(200,100); pb_a = new QPushButton("Accept", this ); pb_a->setGeometry(0, 0, 100, 50); connect( pb_a, SIGNAL(clicked()), this, SLOT(slot_accept()) ); pb_r = new QPushButton("Reject", this ); pb_r->setGeometry(100, 0, 100, 50); connect( pb_r, SIGNAL(clicked()), this, SLOT(slot_reject()) ); pb_c = new QPushButton("Close", this ); pb_c->setGeometry(0, 50, 200, 50); connect( pb_c, SIGNAL(clicked()), this, SLOT(close()) ); status = "Event : none"; } // 変数statusを返す QString Dlg::getStatus(){ return( status ); } // Acceptボタン押下 void Dlg::slot_accept(){ accept(); } // Rejectボタン押下 void Dlg::slot_reject(){ reject(); } void Dlg::closeEvent( QCloseEvent *e ){ status = "Event : CloseEvent"; e->accept(); }