Qt 的内置对话框大致分为以下几类:

    • QFileDialog:选择文件或者目录;
    • QFontDialog:选择字体;
    • QInputDialog:允许用户输入一个值,并将其值返回;
    • QMessageBox:模态对话框,用于显示信息、询问问题等;
    • QPageSetupDialog:为打印机提供纸张相关的选项;
    • QPrintDialog:打印机配置;
    • QPrintPreviewDialog:打印预览;
    • QProgressDialog:显示操作过程。
      这里我们简单地介绍一下标准对话框QMessageBox的使用。在前面有了关于对话框的基础之上,应该可以结合文档很轻松地学习如何使用 Qt 的标准对话框。其它种类的标准对话框,我们将在后面的章节中再一一介绍。

    QMessageBox用于显示消息提示。我们一般会使用其提供的几个 static 函数:

    • void about(QWidget * parent, const QString & title, const QString & text):显示关于对话框。这是一个最简单的对话框,其标题是 title,内容是 text,父窗口是 parent。对话框只有一个 OK 按钮。
    • :显示关于 Qt 对话框。该对话框用于显示有关 Qt 的信息。
    • StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)QMessageBox::information()函数与QMessageBox::critical()类似,不同之处在于这个对话框提供一个普通信息图标。
    • StandardButton question(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)QMessageBox::question()函数与QMessageBox::critical()类似,不同之处在于这个对话框提供一个问号图标,并且其显示的按钮是“是”和“否”两个。
    • StandardButton warning(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)QMessageBox::warning()函数与QMessageBox::critical()类似,不同之处在于这个对话框提供一个黄色叹号图标。
      我们可以通过下面的代码来演示下如何使用。

    QMessageBox类的 static 函数优点是方便使用,缺点也很明显:非常不灵活。我们只能使用简单的几种形式。为了能够定制QMessageBox细节,我们必须使用QMessageBox的属性设置 API。如果我们希望制作一个询问是否保存的对话框,我们可以使用如下的代码:

    1. QMessageBox msgBox;
    2. msgBox.setText(tr("The document has been modified."));
    3. msgBox.setInformativeText(tr("Do you want to save your changes?"));
    4. msgBox.setDetailedText(tr("Differences here..."));
    5. msgBox.setStandardButtons(QMessageBox::Save
    6. | QMessageBox::Discard
    7. | QMessageBox::Cancel);
    8. int ret = msgBox.exec();
    9. switch (ret) {
    10. case QMessageBox::Save:
    11. qDebug() << "Save document!";
    12. break;
    13. case QMessageBox::Discard:
    14. qDebug() << "Discard changes!";
    15. break;
    16. case QMessageBox::Cancel:
    17. qDebug() << "Close document!";
    18. }

    同时在 KDE 和 Windows 7 上编译运行一下上面的代码,我们可以看到一些区别:

    自定义 QMessageBox - KDE

    除去对话框样式,我们值得注意的是QMessageBox下方按钮的排列顺序。KDE 上是 Show Details…、Save、Discard 和 Cancel;而 Windows 7 上则是 Save、Discard、Show Details… 和 Cancel。我们并没有指定按钮的顺序,Qt 已经帮我们按照不同平台的使用习惯对其进行了调整。这一点在 Mac OS 上也会有相应的体现。对于一个普通的QDialog而言,Qt 使用的是这个类来实现不同平台的对话框按钮顺序的显示的。更多细节请参考这个类的文档。