web-dev-qa-db-ja.com

QMessageBoxを使用したYes / Noメッセージボックス

Qtで[はい]/[いいえ]ボタンを含むメッセージボックスを表示するにはどうすればよいですか。どのボタンが押されたかを確認するにはどうすればよいですか。

つまり次のようなメッセージボックス:

enter image description here

96
sashoalm

そのために 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 "適切なデフォルトを自動的に選択します")。

167
Mat

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
}
37
rednaks

QTは、Windowsと同じくらい簡単にできます。同等のコードは

if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec()) 
{

}
17
hkyi

回答に翻訳変数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コンテキストの外にいる場合でも、trqApp->translate("context", "String")に置き換えてください-#include <QApplication>が必要です

4
DomTomCat

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
        ;
}
3
Toby Speight