Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 |

2006-05-08(Mon)

C++でQTアプリ(その9) ダイアログの作成

クラスQDialogを使ってダイアログ用サブウィンドウを作成してみる。クラスDlgはQDialogを継承ボタンAcceptReject、Closeを配置して各々同名のスロットウィンドウを閉じるようにしている。またgetStatus関数によってCloseEventの発生を知ることができるようにしてみた。

ダイアログウィンドウクラスDialogTest上のnewで新規ウィジェットを作成し、execで表示を行い結果を取得している。ちなみにダイアログはモーダルで作成している。

これでウィンドウの閉じ方による返り値とCloseEventの発生の有無を調べてみると以下の様な結果となる。

 OK(右上):Accepted、CloseEventなし
 X(右上):Rejected、CloseEvent発生
 Accept :Accepted、CloseEventなし
 Reject :Rejected、CloseEventなし
 Close  :Rejected、CloseEvent発生

CloseEventはウィンドウを閉じる全ての場合に発生するものでは無いらしい。というかAcceptRejectは実際にはウィンドウを閉じていない?

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

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20060508/p1
リンク元