【问题标题】:Monospaced detailedText in QMessageBoxQMessageBox中的等宽详细文本
【发布时间】:2014-04-26 12:11:42
【问题描述】:

我一直在使用QMessageBox 来显示统计测试的结果。很好,因为我可以将摘要结果放在信息文本中,然后将完整结果放在详细文本中。麻烦的是,完整的结果是一个表格,所以我希望它是等宽的,这样它看起来正确,QMessageBox 在详细的文本区域中不使用等宽字体。

所以我正在查看子类化QMessageBox,或子类化QDialog 以制作看起来像QMessageBox 但在详细文本区域中使用等宽字体的东西。我现在有点生疏,很难弄清楚哪个是更好的选择。我可以继承QMessageBox,只需添加我自己的QTextEdit 和我自己的“显示详细文本”按钮,然后隐藏QMessageBox 详细文本区域和按钮吗?或者有更简单的方法吗?

【问题讨论】:

    标签: qt subclassing qmessagebox


    【解决方案1】:

    我没有找到比这更好的:

    setStyleSheet("QTextEdit { font-family: monospace; }");
    

    这有点 hacky,因为 (1) 它使用样式表,这可能与您设置小部件样式的方式相冲突,并且 (2) 它依赖于详细文本位于 QTextEdit 中的事实,并且是唯一这样的元素,API 没有正式保证这一点。但它有效。 :D

    【讨论】:

    • 谢谢。这在适用于 Windows 的 C++ Qt 4.7.4 版和适用于 Linux 的 4.8.5 版中对我有用。
    【解决方案2】:

    您可以在 QMessageBox 的字段中使用 html 文本,这将是最简单的方法。作为提示,请尝试放置

     <pre>Test</pre>
    

    在你的 QString 中。

    不过,消息框的任何其他自定义都可能意味着子类。

    【讨论】:

    • HTML 似乎适用于信息性文本,但不适用于详细文本。它似乎使用 ASCII(我可以使用特殊字符,例如不间断空格,但必须使用转义的 ASCII 代码而不是 HTML 代码)。像
       这样的标签会按字面意思出现在详细的文本区域中。
    【解决方案3】:

    这是一个工作示例,基于Lithy 的回答:

    import sys
    from PySide2.QtCore import *
    from PySide2.QtWidgets import *
    
    table_text = '\
    Name    Flower\n\
    ------  -------\n\
    Violet  Yes\n\
    Robert  No\n\
    Daisy   Yes\n\
    Anna    No\n\
    '
    
    class Widget(QWidget):
        def __init__(self, parent= None):
            super(Widget, self).__init__()
            warning_text = 'warning_text'
            info_text = 'info_text'
            pt = 'colour  name'
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText(warning_text)
            msg.setInformativeText(info_text)
            msg.setDetailedText("{}".format(table_text))
            msg.setTextInteractionFlags(Qt.TextSelectableByMouse)
            # print all children and their children to find out which widget
            # is the one that contains the detailed text
            for child in msg.children():
                print('child:{}'.format(child))
                print(' {}'.format(child.children()))
            pname = 'QMessageBox'
            cname = 'QTextEdit'
            msg.setStyleSheet(
                """{} {} {{ background-color: red; color: black; font-family: Courier; }}""".format(pname, cname))
            msg.exec_()
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        Widget()
    

    【讨论】:

      【解决方案4】:

      您可以使用此 hack 在 QMessageBox 的详细文本中使用 html 文本:

      QString html_formatted_text;
      QMessageBox mb;
      mb.setDetailedText(html_formatted_text);
      // Find detailed text widget
      auto te = mb.findChild<QTextEdit*>();
      if (te) {
          te->setHtml(mb.detailedText());
      }
      mb.exec();
      

      【讨论】:

        猜你喜欢
        • 2016-07-05
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多