hakeの日記

Windows環境でプログラミングの勉強をしています。

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();
}