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

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

例如,一个看起来像这样的信息框:

enter image description here

190949 次浏览

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

你可以使用 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 += console在 Win32上查看 qDebug()输出。

查看 StandardButton枚举获取可以使用的按钮列表; 该函数返回被单击的按钮。您可以设置一个带有额外参数的默认按钮(如果不设置,则设置 Qt“ 自动选择一个合适的默认值”或指定 QMessageBox::NoButton)。

QT 可以像 Windows 一样简单

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


}

我的答案里没有翻译电话 tr

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

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

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

(上述 QMessagebox在任何 QWidget方法内工作)

编辑:

你可以在 QWidget上下文之外使用 QMesssageBox,见@TobySpeight 的回答。

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

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

如果您想在 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_()

Python QMessageBox 的等效代码,其中包含一个问题以及 是的没有按钮。单击“是”按钮时,将弹出另一个消息框,说“是”被单击,“否”按钮也是如此。可以在 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")


如果需要异步调用,应该使用 openresult方法而不是 questionexec方法。QWidget方法中的示例代码:

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

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