【Qt控件之QMessageBox】详解

Qt控件之QMessageBox

      • 描述
        • 基于属性的API
        • 富文本和文本格式属性
        • 严重程度以及图标和Pixmap属性
        • 静态函数API
      • 高级用法
      • 默认按钮和退出按钮
      • 示例
      • 使用场景

描述

QMessageBox类提供了一个模态对话框,用于通知用户或向用户提问并接收答案。

消息框显示一个主要文本以提醒用户注意某个情况,显示一个信息性文本以进一步解释该提醒或向用户提问,显示一个可选的详细文本以在用户请求时提供更多数据。
消息框还可以显示一个图标和标准按钮以接受用户响应。
提供了两个使用QMessageBoxAPI,基于属性的API静态函数。调用其中一个静态函数是一种更简单的方法,但与使用基于属性的API相比,它的灵活性较差,结果信息量也较少。建议使用基于属性的API

基于属性的API

要使用基于属性的API,请构造QMessageBox的实例,设置所需的属性,然后调用exec()来显示消息。最简单的配置是仅设置消息文本属性。

QMessageBox msgBox;
msgBox.setText("文档已被修改。");
msgBox.exec();

用户必须单击“确定”按钮才能关闭消息框。在消息框关闭之前,其余的 GUI 会被阻止。
【Qt控件之QMessageBox】详解_第1张图片
除了提醒用户事件之外,更好的方法是询问用户如何处理该事件。将问题存储在信息文本属性中,并将标准按钮属性设置为希望用户响应的按钮集。按钮是通过使用位或运算符将标准按钮的值组合在一起来指定的。按钮的显示顺序取决于平台。例如,在Windows上,保存显示在取消的左侧,而在Mac OS上,顺序相反。
将你的标准按钮之一标记为默认按钮。

QMessageBox msgBox;
msgBox.setText("文档已被修改。");
msgBox.setInformativeText("是否要保存更改?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox. defaultButton(QMessageBox::Save);
int ret = msgBox.exec();

这是macOS指南中推荐的方法。类似的指南适用于其他平台,但请注意不同平台处理信息文本的不同方式。
【Qt控件之QMessageBox】详解_第2张图片

exec() 槽返回被点击按钮的 StandardButtons 值。

  switch (ret) {
    case QMessageBox::Save:
        // Save was clicked
        break;
    case QMessageBox::Discard:
        // Don't Save was clicked
        break;
    case QMessageBox::Cancel:
        // Cancel was clicked
        break;
    default:
        // should never be reached
        break;
  }

为了给用户提供更多信息以帮助他回答问题,请设置详细文本属性。如果设置了详细文本属性,则将显示显示详细信息...按钮。
【Qt控件之QMessageBox】详解_第3张图片
单击显示详细信息... 按钮显示详细文本。
【Qt控件之QMessageBox】详解_第4张图片

富文本和文本格式属性

详细的文本属性始终被解释为纯文本。主要文本和信息文本属性可以是纯文本或富文本。这些字符串根据文本格式属性的设置进行解释。默认设置为自动文本。
请注意,对于一些包含XML元字符的纯文本字符串,自动文本富格文本检测测试可能会失败,导致您的纯文本字符串被错误地解释为富格文本。在这些罕见的情况下,使用Qt::convertFromPlainText()将纯文本字符串转换为视觉上等效的富格文本字符串,或使用 textsFormat()显式设置文本格式属性。

严重程度以及图标和Pixmap属性

QMessageBox支持四种预定义的消息严重级别或消息类型,它们的不同之处仅在于各自显示的预定义图标。通过将图标属性设置为预定义图标之一,指定四种预定义消息类型中的一种。以下规则是准则:
【Qt控件之QMessageBox】详解_第5张图片
预定义图标不是由 QMessageBox 定义的,而是由样式提供的。默认值为无图标。否则,消息框在所有情况下都是相同的。使用标准图标时,请使用表中推荐的图标,或使用您的平台样式指南推荐的图标。如果所有标准图标都不适合您的消息框,则可以通过设置图标 pixmap 属性而不是设置图标属性来使用自定义图标。
总之,要设置图标,可以使用setIcon()设置标准图标,或使用setIconPixmap() 设置自定义图标。

静态函数API

尽管使用静态函数API构建消息框很方便,但它的灵活性比不上基于属性的API,因为静态函数的签名缺少用于设置信息文本和详细文本属性的参数。解决这个问题的一种办法是将标题参数用作消息框的主要文本,将文本参数用作消息框的信息文本。因为这会使消息框的易读性降低,所以平台指南不建议这样做。Microsoft Windows用户界面指南建议使用应用程序名称作为窗口的标题,这意味着如果您除了主文本之外还有信息文本,必须将其连接到文本参数中。
请注意,静态函数的签名相对于其按钮参数已经发生了变化,现在这些按钮参数用于设置标准按钮和默认按钮。
静态函数可用于创建information(), question(), warning(),和 critical()消息框。

  int ret = QMessageBox::warning(this, tr("My Application"),
                                 tr("The document has been modified.\n"
                                    "Do you want to save your changes?"),
                                 QMessageBox::Save | QMessageBox::Discard
                                 | QMessageBox::Cancel,
                                 QMessageBox::Save);

标准对话框示例显示了如何使用QMessageBox和其他内置Qt对话框。

高级用法

如果标准按钮对于您的消息框不够灵活,您可以使用 addButton() 重载,该重载接受文本ButtonRole,以添加自定义按钮。 ButtonRoleQMessageBox 使用,用于确定屏幕上按钮的顺序(根据平台而有所不同)。您可以在调用 exec() 后测试 clickedButton() 的值。
例如:

  QMessageBox msgBox;
  QPushButton *connectButton = msgBox.addButton(tr("Connect"), QMessageBox::ActionRole);
  QPushButton *abortButton = msgBox.addButton(QMessageBox::Abort);

  msgBox.exec();

  if (msgBox.clickedButton() == connectButton) {
      // connect
  } else if (msgBox.clickedButton() == abortButton) {
      // abort
  }

默认按钮和退出按钮

默认按钮(即按下回车键时激活的按钮)可以使用setDefaultButton()方法来指定。如果未指定默认按钮,QMessageBox会根据消息框中使用的按钮的角色来查找一个默认按钮。
退出按钮(按下Esc键时激活的按钮)可以使用setEscapeButton()方法来指定。如果未指定逃逸按钮,QMessageBox会照以下规则来查找:
如果只有一个按钮,则该按钮为按下Esc键时激活的按钮。
如果存在一个取消按钮,则该按钮为按下Esc键时激活的按钮。
如果存在一个拒绝角色或者无角色的按钮,则该按钮为按下Esc键时激活的按钮。
当无根据上述规则确定退出按钮时,按下Esc键将没有任何效果。

示例

开发时,如果有两个按钮设置为中文,则右上角的窗口关闭按钮无法使能,以下是解决方案:

    QMessageBox msgBox;
    msgBox.setText("当前显示一个按钮");
    msgBox.setInformativeText("此行是信息文本");
    msgBox.addButton("确定", QMessageBox::YesRole);
    msgBox.addButton("取消", QMessageBox::NoRole);
    msgBox.exec();
    // 点击的按钮
    QAbstractButton* pBtn = msgBox.clickedButton();

【Qt控件之QMessageBox】详解_第6张图片

使用场景

QMessageBox的常见使用场景:

  1. 提示信息:可以通过QMessageBox显示一条简单的提示信息,比如告知用户某个操作已经完成或者出错了。

  2. 警告信息:可以使用QMessageBox显示警告信息,警示用户某个操作可能会带来一些风险或者不符合预期。

  3. 错误信息:当程序出现错误时,可以使用QMessageBox显示错误信息,告知用户发生了什么问题以及如何处理。

  4. 确认对话框:如果需要用户确认一个操作,可以使用QMessageBox显示确认对话框,询问用户是否继续。

  5. 询问对话框:有时候需要从用户那里获取一些简单的选择,比如是否保存修改,可以使用QMessageBox显示询问对话框以获取用户的选择。

  6. 提示输入:可以使用QMessageBoxQInputDialog结合,用于提示用户输入一些简单的文本或者进行选择。

总的来说,QMessageBox适用于需要向用户显示简单信息或者进行简单交互的场景,例如程序的提示、警告以及一些基本的确认和选择操作。

你可能感兴趣的:(Qt记录,qt,开发语言)