是/否使用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>