Qtで[はい]/[いいえ]ボタンを含むメッセージボックスを表示するにはどうすればよいですか。どのボタンが押されたかを確認するにはどうすればよいですか。
つまり次のようなメッセージボックス:
そのために QMessageBox::question
を使用します。
架空のウィジェットのスロットの例:
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
// ...
void MyWidget::someSlot() {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "Test", "Quit?",
QMessageBox::Yes|QMessageBox::No);
if (reply == QMessageBox::Yes) {
qDebug() << "Yes was clicked";
QApplication::quit();
} else {
qDebug() << "Yes was *not* clicked";
}
}
Qt 4および5で動作するはずです。Qt5ではQT += widgets
が必要で、qDebug()
出力を表示するにはWin32ではCONFIG += console
が必要です。
StandardButton
enumを参照して、使用できるボタンのリストを取得してください。関数は、クリックされたボタンを返します。追加の引数を使用してデフォルトボタンを設定できます(_tQMessageBox::NoButton
を指定しない場合、または指定しない場合、Qt "適切なデフォルトを自動的に選択します")。
Messageオブジェクトを使用してメッセージボックスを作成し、ボタンを追加できます。
QMessageBox msgBox;
msgBox.setWindowTitle("title");
msgBox.setText("Question");
msgBox.setStandardButtons(QMessageBox::Yes);
msgBox.addButton(QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No);
if(msgBox.exec() == QMessageBox::Yes){
// do something
}else {
// do something else
}
QTは、Windowsと同じくらい簡単にできます。同等のコードは
if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec())
{
}
回答に翻訳変数tr
がありません。
後の国際化を可能にする最も簡単なソリューションの1つ:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
通常、コードレベルの文字列をtr("Your String")
呼び出し内に配置することは、Qt
の習慣として適切です。
(上記のQMessagebox
は、QWidget
メソッド内で機能します)
編集:
QMesssageBox
コンテキストの外部でQWidget
を使用できます。@ TobySpeightの答えを参照してください。
QObject
コンテキストの外にいる場合でも、tr
をqApp->translate("context", "String")
に置き換えてください-#include <QApplication>
が必要です
QMessageBox
には、このような質問をすばやく尋ねるための静的メソッドが含まれています。
#include <QApplication>
#include <QMessageBox>
int main(int argc, char **argv)
{
QApplication app{argc, argv};
while (QMessageBox::question(nullptr,
qApp->translate("my_app", "Test"),
qApp->translate("my_app", "Are you sure you want to quit?"),
QMessageBox::Yes|QMessageBox::No)
!= QMessageBox::Yes)
// ask again
;
}
静的メソッドで提供されるものよりもニーズが複雑な場合は、新しいQMessageBox
オブジェクトを作成し、そのexec()
メソッドを呼び出して独自のイベントループで表示し、押されたボタン識別子を取得する必要があります。たとえば、「いいえ」をデフォルトの回答にしたい場合があります。
#include <QApplication>
#include <QMessageBox>
int main(int argc, char **argv)
{
QApplication app{argc, argv};
auto question = new QMessageBox(QMessageBox::Question,
qApp->translate("my_app", "Test"),
qApp->translate("my_app", "Are you sure you want to quit?"),
QMessageBox::Yes|QMessageBox::No,
nullptr);
question->setDefaultButton(QMessageBox::No);
while (question->exec() != QMessageBox::Yes)
// ask again
;
}