- 何かをさせる前にユーザーに確認メッセージを出してみましょう。
- ソースコードは utf-8 前提です。
- 動作確認環境 : Ruby 1.8.4 + rubyqte 0.5.3
メッセージボックスを出してみる
メッセージボックスは QMessageBox.about 等のように直接呼び出す方法と、QMessageBox.new でオブジェクトを生成してある程度カスタマイズした後に .exec メソッドでダイアログを呼び出す方法の2通りあります。
少し大きめになりましたが、サンプルスクリプトをご覧ください。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
| | require 'qte'
require 'qpe'
include Qte
include Qpe
$KCODE = "UTF8"
class MainWindow < QMainWindow
def initialize
super
self.setCaption(tr("(10) QMessageBox さんぷる"))
@mybox = QVBox.new(self)
self.setCentralWidget(@mybox)
@mybox.setMargin(5) @label = QLabel.new(tr("さんぷる"), @mybox) @btn_ok = QPushButton.new(tr("About ダイアログを出す"), @mybox) connect(@btn_ok, QSIGNAL("clicked()"), self, 'dlg_ok')
@btn_2 = QPushButton.new(tr("ボタン2つ のダイアログを出す"), @mybox) connect(@btn_2, QSIGNAL("clicked()"), self, 'dlg_yn')
@btn_ext = QPushButton.new(tr("ボタン3つ のダイアログを出す"), @mybox) connect(@btn_ext, QSIGNAL("clicked()"), self, 'dlg_ext')
@btn_sw = QPushButton.new(tr("条件分岐のサンプルを実行する"), @mybox) connect(@btn_sw, QSIGNAL("clicked()"), self, 'dlg_sw')
end
def dlg_ok
result = QMessageBox.about(self, tr("About ダイアログのテスト"), tr("情報ダイアログのテストです。"))
end
def dlg_yn
result = QMessageBox.critical(
self,
tr("2ボタンのテスト"),
tr("どれかボタンを押してください。"),
tr("第1ボタン"),
tr("第2ボタン"))
puts result.class
puts result.to_s @label.setText(tr("QMessageBoxは "+result.to_s+" を返しました。"))
end
def dlg_dummy
result = QMessageBox.information(
self,
tr("OKだけのテスト"),
tr("どれかボタンを押してください。"))
puts result.class
puts result.to_s
result = QMessageBox.information(
self,
tr("1ボタンのテスト"),
tr("どれかボタンを押してください。"),
tr("第1ボタン"))
puts result.class
puts result.to_s
result = QMessageBox.information(
self,
tr("3ボタンのテスト"),
tr("どれかボタンを押してください。"),
tr("第1ボタン"),
tr("第2ボタン"),
tr("第3ボタン"))
puts result.class
puts result.to_s end
def dlg_ext
msg_ext = QMessageBox.new(
tr("3ボタンのテスト"),
tr("どれかボタンを押してください。"),
QMessageBox::Information, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape )
result = msg_ext.exec
puts result.class puts result.to_s
@label.setText(tr("QMessageBoxは "+result.to_s+" を返しました。"))
end
def dlg_sw
msg_sw = QMessageBox.new(
tr("条件分岐のテスト"),
tr("どれかボタンを押してください。"),
QMessageBox::Warning,
QMessageBox::Abort, QMessageBox::Retry, QMessageBox::Ignore)
result = msg_sw.exec
btn_label = ""
case result
when QMessageBox::Abort
btn_label = "「中断」"
when QMessageBox::Retry
btn_label = "「再試行」"
when QMessageBox::Ignore
btn_label = "「無視」"
else
@label.setText(tr("Cancel されました。"))
return
end
@label.setText(tr(btn_label +" ボタンが押されました。"))
end
end
class MyApplication < QPEApplication
def initialize
super([$0]+ARGV)
self.setDefaultCodec(QTextCodec::codecForName("utf-8"))
end
end
app = MyApplication.new
win = MainWindow.new()
app.showMainWidget(win)
app.exec
|
情報ダイアログを呼び出す QMessageBox.about
一番お手軽に呼び出せるのはサンプル30行目にある about メソッドでしょう。OK ボタンだけの情報ダイアログで、OK ボタン押下(Enter キー、Space キー、OK キー) か右上の × ボタン(Cancel キー) でダイアログを閉じることができますが、あくまでも情報表示専用のために、それ以上の機能はありません。
サンプルでは result に返値を代入していますが、返値は nil のため使い道がありません。
呼び方としては、 QMessageBox.about(self, tr(ダイアログタイトル), tr(表示したいメッセージ)) となります。
第1~第3ボタンを追加定義可能な .information / .warning / .critical メソッド
ユーザーに何らかの選択を行わせる際は、36~41行目 の QMessageBox.critical() のような呼び出しを行って、返値を見て分岐させることができます。返値は Cancel や×ボタンを押したときに -1、第1~第3ボタン(第2、第3は省略可能。第1を省略した場合は OK というラベルの第1ボタンができます) が押されたときは 0~2が返ってきます。
呼び出し方は QMessageBox.information() QMessageBox.warning() QMessageBox.critical() とも共通で、QMessageBox.information(self, tr(ダイアログタイトル), tr(表示したいメッセージ),tr(第1ボタンのラベル),tr(第2ボタンのラベル),tr(第3ボタンのラベル)) ( tr(第nボタン) はすべて省略可能) です。
.information .warning .critical の違いはダイアログ左側に出るアイコンだけです。それぞれ、吹き出しの i (Information の頭文字)、黄色の△の中に!記号、赤い○の中に×記号という、Windows でもお馴染みのアイコンになっています。
複雑でも自由度が高い .new メソッドと .exec メソッドの組み合わせ
呼び出し方は複雑ですが、QMessageBox.new でオブジェクトを生成して .exec メソッドでダイアログを呼び出す方法があります。.new メソッドは引数の数が固定されており、QMessageBox.new(tr(タイトル), tr(表示したい質問メッセージ), 左側に表示するアイコンを示す定数, 第1ボタンの定数, 第2ボタンの定数, 第3ボタンの定数) となっています。
返値は「はい」「いいえ」などに関連付けされた定数そのもの(1~7の数値)か、QMessageBox::Escape 未指定時の Cancel を意味する 0 に固定されており、第1~第3ボタンの順序に依存しません。
「左側に表示するアイコンを示す定数」
左側に表示するアイコンは、非表示を含めて4種類指定できます。
定数名 | 数値 | アイコン | 意味 |
QMessageBox::NoIcon | 0 | (無し) | アイコン不要時はこれを指定します。 |
QMessageBox::Information | 1 |
| 情報表示用です。 |
QMessageBox::Warning | 2 |
| 警告やエラーの表示用です。 |
QMessageBox::Critical | 3 |
| 致命的なエラーの表示用です。 |
※QMessageBox::Question (4) は Qt/E 2.3.2 においてはまだ未定義で利用できません。
「第nボタンの定数」
ボタンについては、以下の8種類(非表示含む)と、追加属性2種類(7種類のどれかに | で OR 演算する)があります。いずれも Fixnum、つまり数値型です。
なお、「デフォルトのラベル」は .setButtonText(ボタンの定数, tr(置換後のラベル)) で変更することもできます。サンプルの88行目を参考にして、好きなように書き換えてみてください。
定数名 | 数値 | デフォルトのラベル | 意味 |
ボタン本体 |
QMessageBox::NoButton | 0 | (表示しない) | .new でボタンを1~2個にしたい場合はこのダミーボタンを使います。3個すべてをこれにしてしまうと、OK ボタンひとつ扱いとなりますので注意してください。 |
QMessageBox::Ok | 1 | OK | 確認用メッセージで使います。デフォルトで OK キーとは何の関係もないので、QMessageBox::Default も一緒に指定することをお勧めします。 |
QMessageBox::Cancel | 2 | 中止 | 何らかの処理を中止する場合に使います。デフォルトで Cancel キーとは何の関係もないので、QMessageBox::Escape も一緒に指定することをお勧めします。 |
QMessageBox::Yes | 3 | はい | はい/いいえの質問用です。 |
QMessageBox::No | 4 | いいえ | はい/いいえの質問用です。 |
QMessageBox::Abort | 5 | 中断 | 処理を中断するときに使います。 |
QMessageBox::Retry | 6 | 再試行 | 処理失敗時にもう一度処理をリトライする場合に使います。 |
QMessageBox::Ignore | 7 | 無視 | 処理失敗時に、その処理をスキップして続行する場合に使います。 |
追加属性(半角の|を付けて OR 演算で指定します) |
QMessageBox::Default | OR 256 | | 初期選択状態のボタンを指定します。 |
QMessageBox::Escape | OR 512 | | Cancel キーや×ボタンを押された時はそのボタンが押されたものと見なします。 |
※QMessageBox::YesAll (8, すべてはい) や QMessageBox::NoAll (9, すべていいえ) は Qt/E 2.3.2 においては未定義です。また、8 や 9 を直接指定すると OK ボタンとなります。