是/否使用QMessageBox的消息框

时间:2012-10-28 18:24:20

标签: c++ qt qmessagebox

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

即。一个如下所示的消息框:

enter image description here

7 个答案:

答案 0 :(得分:164)

您可以使用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 += widgets,在Win32上需要CONFIG += console才能看到qDebug()输出。

请参阅StandardButton枚举以获取可以使用的按钮列表;该函数返回单击的按钮。您可以设置带有额外参数的默认按钮(如果您没有,则选择选择合适的默认值”或指定QMessageBox::NoButton)。

答案 1 :(得分:36)

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

答案 2 :(得分:15)

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

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

}

答案 3 :(得分:4)

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

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

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 :(得分:3)

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

答案 5 :(得分:0)

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")

答案 6 :(得分:-1)

如果要使用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_()