使用 QMessageBox 的“是/否”消息框

Yes/No message box using QMessageBox

提问人:sashoalm 提问时间:10/29/2012 最后编辑:sashoalm 更新时间:7/26/2022 访问量:204954

问:

如何在Qt中显示带有“是/否”按钮的消息框,以及如何检查按下了哪些按钮?

即一个消息框,如下所示:

enter image description here

C++ Qt QMessageBox

评论


答:

47赞 rednaks 10/29/2012 #1

您可以使用 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
}

评论

0赞 Dariusz 7/16/2017
有趣的答案,您将如何为其添加图标?喜欢信息吗?
1赞 rednaks 7/17/2017
@Dariusz:你有 object 的方法部分。如果这些枚举作为参数,则为:doc.qt.io/qt-4.8/qmessagebox.html#icon-propsetIconQMessageBoxQMessageBox::NoIconQMessageBox::QuestionQMessageBox::Information
213赞 Mat 10/29/2012 #2

为此,您将使用 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 5 上的 QT += 小部件,以及 Win32 上的 CONFIG += 控制台才能查看 qDebug() 输出。

请参阅 StandardButton 枚举以获取可以使用的按钮列表;该函数返回单击的按钮。您可以使用额外的参数设置默认按钮(如果您不这样做或指定,Qt会“自动选择合适的默认值”)。QMessageBox::NoButton

评论

0赞 rbaleksandar 10/28/2014
我有一个关于动态生成消息框的方式的问题:是像这样做更好,还是预定义整个事情(创建消息框并将其存储在变量中等),然后在需要时简单地调用它?
1赞 JoshL 11/6/2014
@rbaleksandar 最好使用 QMessageBox 静态方法。当方法返回时,Qt将清理所有使用的内存,没有必要将一个永久保留在内存中。
0赞 rbaleksandar 11/6/2014
谢谢,这是有道理的。毕竟,UI的这一部分不是1)需要大量资源,因此需要一些时间来加载,以及2)经常甚至经常出现在屏幕上供用户查看。
22赞 hkyi 11/3/2013 #3

QT 可以像 Windows 一样简单。等效代码是

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

}
6赞 DomTomCat 3/15/2017 #4

我在答案中错过了翻译电话。tr

最简单的解决方案之一,允许以后的国际化:

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

在调用中放置代码级字符串通常是一个好习惯。Qttr("Your String")

(QMessagebox如上所述,适用于任何方法)QWidget

编辑:

您可以在上下文之外使用,请参阅 @TobySpeight 的答案。QMesssageBoxQWidget

如果您甚至在上下文之外,请替换为 - 您需要QObjecttrqApp->translate("context", "String")#include <QApplication>

4赞 Toby Speight 3/15/2017 #5

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

如果您的需求比静态方法提供的更复杂,则应构造一个新对象,并调用其方法以在其自己的事件循环中显示它并获取按下的按钮标识符。例如,我们可能希望将“否”设置为默认答案:QMessageBoxexec()

#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赞 DomTomCat 3/15/2017
既然你已经包括了,我建议使用 ,它取代了在类外使用QApplicationqApp->translate("context", "String")trQObject
-1赞 2 revs, 2 users 62%Rajendra Prasad Taidala #6

如果你想在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_()
2赞 peerpressure 11/28/2020 #7

QMessageBox 的 Python 等效代码,其中包含一个问题和“是”和“”按钮。单击“是”按钮时,它将弹出另一个消息框,提示“是”,而“否”按钮也是如此。您可以在 if 块之后推送自己的代码。

button_reply = QMessageBox.question(self,"Test", "Are you sure want to quit??", QMessageBox.Yes,QMessageBox.No,)

if button_reply == QMessageBox.Yes:
    QMessageBox.information(self, "Test", "Yes Button Was Clicked")
else :
    QMessageBox.information(self, "Test", "No Button Was Clicked")

4赞 Nicolas D. 7/26/2022 #8

如果需要异步调用,则应使用 和 方法而不是 或 。方法中的示例代码:openresultquestionexecQWidget

QMessageBox* const message = new QMessageBox(QMessageBox::Icon::Question, tr("Test"),
    tr("Quit?"), QMessageBox::Button::Yes | QMessageBox::Button::No, this);
message->setDefaultButton(QMessageBox::Button::No);
message->open();
connect(message, &QDialog::finished, this, [message] {
    message->deleteLater();
    if (message->result() == QMessageBox::Button::Yes) {
        QApplication::quit();
    }
});

它不应该只对退出对话框有用,但对于其他确认对话框,其中父小部件可能会被外部事件破坏,这是避免崩溃的主要方法。