2012-10-28 47 views

回答

139

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

+0

我有一个关于动态生成消息框的方式的问题:是这样做还是预定义整个事情(创建并将消息框存储在变量等中),然后在需要时调用它? – rbaleksandar

+1

@rbaleksandar最好使用QMessageBox静态方法。 Qt将清理方法返回时使用的所有内存,不需要将其永久保存在内存中。 – JoshL

+0

谢谢,这很有道理。毕竟,这部分用户界面不是1)需要大量资源,因此需要一些时间来加载,并且2)经常甚至不断地在用户看到它的屏幕上。 – rbaleksandar

30

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

有趣的答案,您会如何为它添加图标?喜欢信息? – Dariusz

+0

@Dariusz:你有'QMessageBox'对象的'setIcon'方法部分。有一个如果这些枚举作为参数:'QMessageBox :: NoIcon'' QMessageBox :: Question'' QMessageBox :: Information' http://doc.qt.io/qt-4.8/qmessagebox.html#icon-prop – rednaks

15

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

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

} 
3

我错过了翻译电话tr的答案。

最简单的解决方案,这使得后来的国际化:

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

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

QMessagebox任何QWidget方法中如上述作品)

编辑:

你可以使用一个QMesssageBox背景QWidget外面,看到@ TobySpeight的答案。

如果一个QObject环境之外扯平了,更换trqApp->translate("context", "String") - 你需要#include <QApplication>

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

如果你的需求比静态方法提供的更复杂,你应该构造一个新的对象,并调用它的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 
     ; 
} 
+1

既然你已经包含了'QApplication',我建议使用'qApp-> translate(“context”,“String”)'',它替代'tr'以在'QObject'类外使用 – DomTomCat

相关问题