QMessageBoxを使用したはい/いいえメッセージボックス


108

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

つまり、次のようなメッセージボックスです。

ここに画像の説明を入力してください

回答:


184

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で動作するはずですがQT += widgets、Qt 5とCONFIG += consoleWin32でqDebug()出力を確認する必要があります。

StandardButton列挙型を参照して、使用できるボタンのリストを取得してください。この関数は、クリックされたボタンを返します。追加の引数でデフォルトボタンを設定できます(指定しない場合、または指定しない場合 Qt は適切なデフォルトを自動的に選択しますQMessageBox::NoButton)。


メッセージボックスを動的に生成する方法について質問があります。このようにするか、全体を事前定義して(メッセージボックスを作成して変数に格納するなど)、必要に応じて呼び出すだけの方が良いですか。
rbaleksandar 2014年

1
@rbaleksandar QMessageBox静的メソッドを使用することをお勧めします。Qtは、メソッドが戻ったときに使用されたメモリをクリーンアップします。メモリに永続的に保持する必要はありません。
JoshL 2014年

ありがとう、理にかなっています。結局のところ、UIのこの部分は、1)多くのリソースを必要とするため、ロードにある程度の時間がかかり、2)ユーザーがそれを表示するために画面上に頻繁に、または絶えず表示されるものではありません。
rbaleksandar 2014年

史上最高の答え。
GeneCode、2018

41

QMessageオブジェクトを使用してメッセージボックスを作成し、ボタンを追加できます。

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
}

興味深い答えですが、それにアイコンをどのように追加しますか?情報が好きですか?
Dariusz

1
@Dariusz:オブジェクトのsetIconメソッド部分がありQMessageBoxます。これらの列挙型をQMessageBox::NoIcon QMessageBox::Question QMessageBox::Information パラメーター
rednaks

19

QTはWindowsの場合と同じくらい簡単です。同等のコードは

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

}

5

tr回答に翻訳の電話がありません。

後で国際化を可能にする最も単純なソリューションの1つ:

if (QMessageBox::Yes == QMessageBox::question(this,
                                              tr("title"),
                                              tr("Message/Question")))
{
    // do stuff
}

通常、Qtコードレベルの文字列をtr("Your String")呼び出し内に置くことは良い習慣です。

QMessagebox上記のように、どのQWidgetメソッドでも機能します)

編集:

コンテキストのQMesssageBox外で使用できますQWidget。@ TobySpeightの回答を参照してください。

あなたがQObjectコンテキストの外にいる場合でも、に置き換えtrてくださいqApp->translate("context", "String")-あなたはする必要があります#include <QApplication>


4

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
        ;
}

2
既に含まれているので、クラス外での使用に代わるを使用するQApplicationことをお勧めしますqApp->translate("context", "String")trQObject
DomTomCat

-2

Pythonで作成する場合は、ワークベンチでこのコードを確認する必要があります。このようにも書きます。Pythonでポップアップボックスを作成しました。

msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
msgBox.setDefaultButton(QMessageBox.Save)
ret = msgBox.exec_()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.