Top > Ruby > Qte > QMessageBox
  • 何かをさせる前にユーザーに確認メッセージを出してみましょう。
  • ソースコードは 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
#!/usr/bin/env ruby
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)                        #外側の5ピクセル空け指定
      @label   = QLabel.new(tr("さんぷる"),    @mybox)                         #ラベル 配置
      @btn_ok  = QPushButton.new(tr("About ダイアログを出す"), @mybox)         #ボタン1配置
        connect(@btn_ok, QSIGNAL("clicked()"), self, 'dlg_ok')
      @btn_2   = QPushButton.new(tr("ボタン2つ のダイアログを出す"), @mybox)  #ボタン2配置
        connect(@btn_2, QSIGNAL("clicked()"), self, 'dlg_yn')
      @btn_ext = QPushButton.new(tr("ボタン3つ のダイアログを出す"), @mybox)  #ボタン3配置
        connect(@btn_ext, QSIGNAL("clicked()"), self, 'dlg_ext')
      @btn_sw  = QPushButton.new(tr("条件分岐のサンプルを実行する"), @mybox)   #ボタン4配置
        connect(@btn_sw, QSIGNAL("clicked()"), self, 'dlg_sw')
 
  end
 
  def dlg_ok
    result = QMessageBox.about(self, tr("About ダイアログのテスト"), tr("情報ダイアログのテストです。"))
    #puts result.class #=>NilClass
  end
 
  def dlg_yn
    #.critical の仲間に .information や .warning がいます。
    result = QMessageBox.critical(
      self,
      tr("2ボタンのテスト"),
      tr("どれかボタンを押してください。"),
      tr("第1ボタン"),
      tr("第2ボタン"))
    puts result.class
    puts result.to_s   #=> -1 or 0 or 1 (第nボタンなら n-1、Cancel で -1)
    @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   #=> 0
 
    result = QMessageBox.information(
      self,
      tr("1ボタンのテスト"),
      tr("どれかボタンを押してください。"),
      tr("第1ボタン"))
    puts result.class
    puts result.to_s   #=> 0
 
    result = QMessageBox.information(
      self,
      tr("3ボタンのテスト"),
      tr("どれかボタンを押してください。"),
      tr("第1ボタン"),
      tr("第2ボタン"),
      tr("第3ボタン"))
    puts result.class
    puts result.to_s   #=> 0~2 (第nボタンなら n-1)
  end
 
  def dlg_ext
    msg_ext = QMessageBox.new(
      tr("3ボタンのテスト"),
      tr("どれかボタンを押してください。"),
      QMessageBox::Information,                     #アイコン指定。
#     QMessageBox::Ok,                              #「OK」    #=> 1 (Fixnum)
      QMessageBox::Yes    | QMessageBox::Default,   #「はい」  #=> 3 (Fixnum)
      QMessageBox::No,                              #「いいえ」#=> 4 (Fixnum)
#     QMessageBox::Abort,                           #「中断」  #=> 5 (Fixnum)
#     QMessageBox::Retry,                           #「再試行」#=> 6 (Fixnum)
#     QMessageBox::Ignore,                          #「無視」  #=> 7 (Fixnum)
      QMessageBox::Cancel | QMessageBox::Escape )   #「中止」  #=> 2 (Fixnum)
    #msg_ext.setButtonText( QMessageBox::Yes,    tr("はいをカスタマイズ") )
 
    result = msg_ext.exec
    puts result.class #=>Fixnum (0 or 1~7。Cancel ボタン時は 0 か QMessageBox::Escape と紐付けされたボタン。)
    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,                           #「中断」  #=> 5 (Fixnum)
      QMessageBox::Retry,                           #「再試行」#=> 6 (Fixnum)
      QMessageBox::Ignore)                          #「無視」  #=> 7 (Fixnum)
 
    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_Sample.png

情報ダイアログを呼び出す 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::NoIcon0(無し)アイコン不要時はこれを指定します。
QMessageBox::Information1
Information.png
情報表示用です。
QMessageBox::Warning2
Warning.png
警告やエラーの表示用です。
QMessageBox::Critical3
Critical.png
致命的なエラーの表示用です。

※QMessageBox::Question (4) は Qt/E 2.3.2 においてはまだ未定義で利用できません。

「第nボタンの定数」

 ボタンについては、以下の8種類(非表示含む)と、追加属性2種類(7種類のどれかに | で OR 演算する)があります。いずれも Fixnum、つまり数値型です。

 なお、「デフォルトのラベル」は .setButtonText(ボタンの定数, tr(置換後のラベル)) で変更することもできます。サンプルの88行目を参考にして、好きなように書き換えてみてください。

定数名数値デフォルトのラベル意味
ボタン本体
QMessageBox::NoButton0(表示しない).new でボタンを1~2個にしたい場合はこのダミーボタンを使います。3個すべてをこれにしてしまうと、OK ボタンひとつ扱いとなりますので注意してください。
QMessageBox::Ok1OK確認用メッセージで使います。デフォルトで OK キーとは何の関係もないので、QMessageBox::Default も一緒に指定することをお勧めします。
QMessageBox::Cancel2中止何らかの処理を中止する場合に使います。デフォルトで Cancel キーとは何の関係もないので、QMessageBox::Escape も一緒に指定することをお勧めします。
QMessageBox::Yes3はいはい/いいえの質問用です。
QMessageBox::No4いいえはい/いいえの質問用です。
QMessageBox::Abort5中断処理を中断するときに使います。
QMessageBox::Retry6再試行処理失敗時にもう一度処理をリトライする場合に使います。
QMessageBox::Ignore7無視処理失敗時に、その処理をスキップして続行する場合に使います。
追加属性(半角の|を付けて OR 演算で指定します)
QMessageBox::DefaultOR 256初期選択状態のボタンを指定します。
QMessageBox::EscapeOR 512Cancel キーや×ボタンを押された時はそのボタンが押されたものと見なします。

※QMessageBox::YesAll (8, すべてはい) や QMessageBox::NoAll (9, すべていいえ) は Qt/E 2.3.2 においては未定義です。また、8 や 9 を直接指定すると OK ボタンとなります。


添付ファイル: fileQMessageBox_Sample.png 795件 [詳細] fileWarning.png 591件 [詳細] fileInformation.png 634件 [詳細] fileCritical.png 675件 [詳細]

リロード   新規 下位ページ作成 凍結解除 差分 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Fri, 22 Jul 2011 21:57:56 JST (1525d)