是/否使用QMessageBox的消息框

如何在Qt中显示带有Yes / Nobutton的消息框,以及如何检查哪些button被按下?

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

在这里输入图像说明

你会使用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枚举以获得可以使用的button列表; 该函数返回被点击的button。 你可以设置一个带有额外参数的默认button(如果你不指定或者指定QMessageBox::NoButton Qt“ 自动select合适的默认值 ”)。

您可以使用QMessage对象创build一个消息框,然后添加button:

 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 } 

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

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

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()方法在自己的事件循环中显示它,并获得按下的button标识符。 例如,我们可能想要使“否”成为默认答案:

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

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

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

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

将代码级别的string放在tr("Your String")调用中通常是一个很好的Qt习惯。

(上面的QMessagebox可以在任何QWidget方法中使用)

编辑:

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

如果你甚至不在QObject上下文中,用qApp->translate("context", "String")代替tr ,你需要#include <QApplication>