16、通用对话框之 QMessageBox

Par @Martin dans le
Tags :

说明: 这些文章都是本人学习”devbean QT 学习之路2”的笔记, 部分内容摘自原文, 部分是自己的领悟.

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

  • QColorDialog: 选择颜色;
  • QFileDialog: 选择文件或者目录;
  • QFontDialog: 选择字体;
  • QInputDialog: 允许用户输入一个值, 并将其值返回;
  • QMessageBox: 模态对话框, 用于显示信息、询问问题等;
  • QPageSetupDialog: 为打印机提供纸张相关的选项;
  • QPrintDialog: 打印机配置;
  • QPrintPreviewDialog: 打印预览;
  • QProgressDialog: 显示操作过程.

看到 QMessageBox 很自然的也就想到 Windows Api MessageBox, 实际这两者也的确差不多, 都是用于显示消息提示的.

QMessageBox 中有几个 static func 我们会经常使用:

void about(QWidget * parent, const QString & title, const QString & text):
显示关于对话框. 这是一个最简单的对话框, 其标题是 title, 内容是 text, 父窗口是 parent. 对话框只有一个 OK 按钮.

void aboutQt(QWidget * parent, const QString & title = QString()):
显示关于 Qt 对话框. 该对话框用于显示有关 Qt 的信息.

StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton):
显示严重错误对话框. 这个对话框将显示一个红色的错误符号. 我们可以通过 buttons 参数指明其显示的按钮. 默认情况下只有一个 Ok 按钮, 我们可以使用 StandardButtons 类型指定多种按钮.

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() 类似, 不同之处在于这个对话框提供一个黄色叹号图标.

我们可以看到大部分 static func 函数有个 StandardButton 返回值, 我们可以根据这个返回值来判断用户点击了 QMessageBox 的哪个按钮, 一般是 QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Yes、QMessageBox::No 等.

if (QMessageBox::Yes == QMessageBox::question(this,
                                              "Question",
                                              "Are you OK?",
                                              QMessageBox::Yes | QMessageBox::No,
                                              QMessageBox::Yes)) {
    QMessageBox::information(this, "Hmmm...", "I'm glad to hear that!");
} else {
    QMessageBox::information(this, "Hmmm...", "I'm sorry!");
}


当然这些 static func 可以满足我们大部分的项目需求, 然而, 有时, 我们需要显示一个特殊的 QMessageBox, 此时, 我们就要使用 QMessageBox 的属性设置 API 来达到目的, 例如我们想弹出下面这种 QMessageBox.

实现这个 QMessageBox 的代码如下:

QMessageBox msgBox;
msgBox.setText(tr("The document has been modified."));
msgBox.setInformativeText(tr("Do you want to save your changes?"));
msgBox.setDetailedText(tr("Differences here..."));
msgBox.setStandardButtons(QMessageBox::Save
                          | QMessageBox::Discard
                          | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
    qDebug() << "Save document!";
    break;
case QMessageBox::Discard:
    qDebug() << "Discard changes!";
    break;
case QMessageBox::Cancel:
    qDebug() << "Close document!";
    break;
}


  • setText() 设置对话框的主要文本信息;
  • setIformativeText() 设置对话框的简单说明文本;
  • setDetailedText() 设置对话框的详细信息, 当我们使用了这个条 API 后, 弹出的对话框就会多出一个 Show Details , 点击就能显示我们设置的详细信息;
  • setStandardButtons() 主动设置了对话框上显示的按钮, 这里我们设置了三个;
  • exec() 弹出模态对话框, 最后根据其返回值进行相应的操作.

更多的 QMessageBox 用法就需要使用时查阅帮助文档了.