「Qtの基礎 - ダイアログ」の版間の差分

ナビゲーションに移動 検索に移動
333行目: 333行目:
     ModelessDlg->show();
     ModelessDlg->show();
  }
  }
</syntaxhighlight>
<br><br>
== メッセージボックス(QMessageBoxクラス) ==
QMessageBoxクラスを使用して、メッセージボックスを表示する。<br>
[書式] QMessageBox <変数名>(親ウインドウのポインタ, タイトル, 表示文字列, ボタン, デフォルト)
<br>
<center>
QMessageBoxクラスのアイコン(enum QMessageBox::Icon)<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | アイコン
! style="background-color:#00ffff;" | 値
! style="background-color:#00ffff;" | 説明
! style="background-color:#00ffff;" | 標準Pixmap
|-
| NoIcon || 0 || アイコンなし ||
|-
| Information || 1 || 情報 || SP_MessageBoxInformation
|-
| Warning || 2 || 警告 || SP_MessageBoxWarning
|-
| Critical || 3 || 重大な問題 || SP_MessageBoxCritical
|-
| Question || 4 || 質問 || SP_MessageBoxQuestion
|}
</center>
<br>
==== 簡素なメッセージボックス ====
状況に応じて、以下に示す4種類を使い分ける。<br>
変数iRetには、<code>QMessageBox::Yes</code>または<code>QMessageBox::No</code>のいずれかが入る。<br>
また、<code>QMessageBox::question</code>は、ボタンを指定しない場合でも[Yes]ボタンと[No]ボタンが表示される。<br>
<syntaxhighlight lang="c++">
QMessageBox::information(this, tr("情報"), tr("メッセージ"));
QMessageBox::warning(this, tr("警告"), tr("メッセージ"));
QMessageBox::critical(this, tr("致命的エラー"), tr("メッセージ"));
int iRet = QMessageBox::question(this, tr("確認"), tr("メッセージ"));
</syntaxhighlight>
<br>
==== 標準のメッセージボックス ====
複数のボタンを表示して選択されたボタンを返す。<br>
<br>
書式1は最初の3つの引数が必須、書式2は必要な情報を後で指定する。<br>
書式1の最後の引数にはウインドウフラグがあるが、ここでは省略している。<br>
[書式1] QMessageBox <変数名>(アイコン, タイトル, 表示文字列, ボタン, 親ウインドウのポインタ)
[書式2] QMessageBox <変数名>(親ウインドウのポインタ)
<br>
以下の例では、上記の書式1の形式でメッセージボックスを表示している。<br>
<syntaxhighlight lang="c++">
QMessageBox MsgBox(QMessageBox::Question, tr("確認"), tr("これでよろしいですか?"),
                    QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, this);
int iRet = MsgBox.exec();
</syntaxhighlight>
<br>
以下の例では、上記の書式2の形式でメッセージボックスを表示している。<br>
<code>setDefaultButton</code>メソッドにより、標準でフォーカスが当たるボタンを指定できる。<br>
<syntaxhighlight lang="c++">
QMessageBox MsgBox(this);
MsgBox.setIcon(QMessageBox::Question);
MsgBox.setWindowTitle(tr("確認"));
MsgBox.setText(tr("これでよろしいですか?"));
MsgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
MsgBox.setDefaultButton(QMessageBox::Cancel);
MsgBox.setButtonText(QMessageBox::Yes, tr("OK"));
MsgBox.setButtonText(QMessageBox::No, tr("Cancel"));
MsgBox.setButtonText(QMessageBox::Cancel, tr("Back"));
int iRet = MsgBox.exec();
</syntaxhighlight>
<br>
==== ボタンについて ====
QMessageBoxクラスでは、様々なボタンが用意されている。<br>
各ボタンには意味があるため、それに応じて使用する必要がある。<br>
<br>
<u>ボタンは記述した順番で並ぶわけではないので注意すること。</u><br>
<u>[Cancel]ボタンを記述しない場合、メッセージボックス右上の[x]ボタンが使用できなくなる可能性がある。</u><br>
<center>
QMessageBoxクラスのボタン(enum QMessageBox::StandardButton)<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | ボタン名
! style="background-color:#00ffff;" | 値
! style="background-color:#00ffff;" | 説明
! style="background-color:#00ffff;" | 役割名
|-
| Ok || 0x00000400 || 了解 || AcceptRole
|-
| Open || 0x00002000 || 開く || AcceptRole
|-
| Save || 0x00000800 || 保存 || AcceptRole
|-
| Cancel || 0x00400000 || キャンセル || RejectRole
|-
| Close || 0x00200000 || 閉じる || RejectRole
|-
| Discard || 0x00800000 || 破棄または保存しない || DestructiveRole
|-
| Apply || 0x02000000 || 現在の変更を適用する || ApplyRole
|-
| Reset || 0x04000000 || リセット || ResetRole
|-
| RestoreDefaults || 0x08000000 || デフォルトに戻す || ResetRole
|-
| Help || 0x01000000 || ヘルプ || HelpRole
|-
| SaveAll || 0x00001000 || 全て保存 || AcceptRole
|-
| Yes || 0x00004000 || はい || YesRole
|-
| YesToAll || 0x00008000 || 全てはい || YesRole
|-
| No || 0x00010000 || いいえ || NoRole
|-
| NoToAll || 0x00020000 || 全ていいえ || NoRole
|-
| Abort || 0x00040000 || 異常終了 || RejectRole
|-
| Retry || 0x00080000 || 再試行 || AcceptRole
|-
| Ignore || 0x00100000 || 無視 || AcceptRole
|-
| NoButton || 0x00000000 || ボタンなし || 無効
|}
</center>
<br>
下表に、各ボタンの役割を示す。<br>
<center>
QMessageBoxクラスのボタンの役割(enum QMessageBox::ButtonRole)<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | ロール名
! style="background-color:#00ffff;" | 値
! style="background-color:#00ffff;" | 説明
|-
| InvalidRole || -1 || 無効
|-
| AcceptRole || 0 || 同意および受諾<br>(OK, Save, SaveAll, Open, Retry, Ignore)
|-
| RejectRole || 1 || 拒否<br>(Abort, Close, Cancel)
|-
| DestructiveRole || 2 || 変更を破棄して閉じる。<br>(Discard)
|-
| ActionRole || 3 || ダイアログ内の要素を変更する。
|-
| HelpRole || 4 || ヘルプ要求<br>(Help)
|-
| YesRole || 5 || 受諾または全て受諾<br>(Yes, YesToAll)
|-
| NoRole || 6 || 拒否または全て拒否<br>(No, NoToAll)
|-
| ResetRole || 7 || ダイアログ内の項目をデフォルトに戻す。<br>(Reset, RestoreDefaults)
|-
| ApplyRole || 8 || 変更を適用する。<br>(Apply)
|}
</center>
<br>
==== プッシュボタン追加 ====
メッセージボックスに任意のボタンを追加する場合、以下のように記述する。<br>
任意のボタンでは、役割も指定する必要がある。<br>
<syntaxhighlight lang="c++">
QMessageBox MsgBox(this);
QPushButton *anyButton = MsgBox.addButton(tr("hoge"), QMessageBox::ActionRole);
MsgBox.setWindowTitle(tr("hogeボタンの表示"));
MsgBox.setText(tr("メッセージ"));
MsgBox.exec();
if(MsgBox.clickedButton() == anyButton)
{  // [hoge]ボタンが押下された場合
    // 処理を記述
}
</syntaxhighlight>
<br>
==== 概要ダイアログ ====
Qtのライセンス等の情報を表示する。<br>
<syntaxhighlight lang="c++">
QMessageBox MsgBox;
MsgBox.aboutQt(this, tr("Qtについて"));
</syntaxhighlight>
<br>
以下の例では、ソフトウェアの説明を表示している。<br>
<code>about</code>メソッドでは、必ずソフトウェアのアイコンが表示される。<br>
<syntaxhighlight lang="c++">
QString strOverView = "<span style=\"font-weight:bold\">Qtサンプル画面</span><br><br>"
                      "このプログラムはQt C++で作成したものです。<br>"
                      "いろいろなレイアウトやウィジェットの使用例が入っています。<br><br>"
                      "※ご注意<br>"
                      "必ずしもこの使用法が正しいとは限りません。<br>"
                      "自分で使うプログラムとしては十分動くというだけです。<br>"
                      "何の保証もありませんので、自己責任でお使いください。<br><br>"
                      "Top Page: "
                      "<a href=\"http://www.sample.com/index.html\">"
                      "http://dorafop.my.coocan.jp/index.html</a>";
QMessageBox MsgBox;
MsgBox.about(this, tr("このプログラムについて"), strOverView);
</syntaxhighlight>
<br>
<code>QMessageBox</code>クラスにおいて、任意のアイコンを表示する場合は、以下のように記述する。<br>
<syntaxhighlight lang="c++">
QMessageBox MsgBox(this);
MsgBox.setText(text);
MsgBox.setWindowTitle(tr("このプログラムについて"));
MsgBox.setIconPixmap(QPixmap(":/images/logo.png"));
MsgBox.exec();
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

案内メニュー