C++ 使用QMessageBox的是/否消息框

C++ 使用QMessageBox的是/否消息框,c++,qt,qmessagebox,C++,Qt,Qmessagebox,如何在Qt中显示带有“是/否”按钮的消息框,以及如何检查按下了哪些按钮 即,一个如下所示的消息框: 您可以使用QMessage对象创建消息框,然后添加按钮: QMessageBox msgBox; msgBox.setWindowTitle("title"); msgBox.setText("Question"); msgBox.setStandardButtons(QMessageBox::Yes); msgBox.addButton(QMessageBox::No); msgBox.setD

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

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


您可以使用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
}
你会用它的

假设小部件插槽中的示例:

#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";
  }
}
#包括
#包括
#包括
// ...
void MyWidget::someSlot(){
QMessageBox::标准按钮回复;
reply=QMessageBox::问题(这是“测试”、“退出?”,
QMessageBox::Yes | QMessageBox::No);
if(reply==QMessageBox::Yes){

qDebug()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(“您的字符串”)
调用中放置代码级字符串通常是一个好的
Qt
习惯

QMessagebox
如上所述在任何
QWidget
方法中工作)

编辑:

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


如果您甚至在
QObject
上下文之外,请将
tr
替换为
qApp->translate(“上下文”、“字符串”)
-您需要
#包括

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

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

PythonQMessageBox的等效代码,其中包含一个问题和YesNo按钮。单击Yes按钮时,会弹出另一个消息框,表示单击Yes,也会显示No按钮。如果阻止,您可以按自己的代码

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


关于动态生成消息框的方式,我有一个问题:这样做更好还是预定义整个过程更好(创建消息框并将其存储在变量中等)然后在需要时调用它?@rbaleksandar最好使用QMessageBox静态方法。当这些方法返回时,Qt将清理所有使用的内存,不需要将其永久保留在内存中。谢谢,这是有意义的。毕竟,UI的这一部分并不需要大量资源,因此需要一些时间来加载和更新2)经常甚至经常出现在屏幕上供用户查看。这是有史以来最好的答案。因为您已经包含了
QApplication
我建议使用
qApp->translate(“上下文”,“字符串”)
,它取代了
tr
,用于
QObject
类有趣答案之外的使用,您将如何向其添加图标?类似信息?@Dariusz:您拥有
QMessageBox
对象的
setIcon
方法部分。如果这些枚举作为参数,则使用一个:
QMessageBox::NoIcon
QMessageBox::Questi在
QMessageBox::Information上
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")