QMessageBox中等宽的detailedText



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

所以我正在看子类化QMessageBox,或子类化QDialog,使一些东西看起来像QMessageBox,但在详细的文本区域使用等宽字体。我现在有点生疏了,而且很难弄清楚哪个是更好的选择。我可以子类QMessageBox,只是添加我自己的QTextEdit和我自己的"显示详细文本"按钮,并留下QMessageBox详细文本区域和按钮隐藏?还是有更简单的方法?

您可以在QMessageBox的字段中使用html文本,这将是最简单的方法。提示一下,试着把

 <pre>Test</pre>

在你的QString.

消息框的任何其他自定义都可能隐含子类。

我没有找到比这更好的了:

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

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

下面是一个基于Lithy回答的工作示例:

import sys
from PySide2.QtCore import *
from PySide2.QtWidgets import *
table_text = '
Name    Flowern
------  -------n
Violet  Yesn
Robert  Non
Daisy   Yesn
Anna    Non
'
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()

可以在QMessageBox的detailedText中使用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();

相关内容

  • 没有找到相关文章

最新更新