使用QMessageBox是/否消息框


108

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

即一个消息框看起来像这样:

在此处输入图片说明

Answers:


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

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 doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
rednaks

19

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

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

}

5

tr在答案中没有翻译请求。

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

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

Qt将代码级字符串放入tr("Your String")调用中通常是一个好习惯。

QMessagebox如上所述,可以使用任何QWidget方法)

编辑:

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

如果您甚至不在QObject上下文中,请替换trqApp->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"),以代替课堂tr外的使用QObject
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_()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.