4

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

因此,我正在查看 subclassingQMessageBox或 subclassingQDialog以制作看起来像 aQMessageBox但在详细文本区域中使用等宽字体的东西。我现在有点生疏,很难弄清楚哪个是更好的选择。我可以子类化QMessageBox,只添加我自己QTextEdit和我自己的“显示详细文本”按钮,并QMessageBox隐藏详细文本区域和按钮吗?还是有一些更简单的方法可以做到这一点?

4

4 回答 4

4

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

 <pre>Test</pre>

在你的 QString 中。

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

于 2014-03-20T02:52:30.097 回答
4

我没有找到比这更好的:

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

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

于 2016-07-14T10:15:00.423 回答
2

这是一个工作示例,基于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()
于 2019-03-28T00:34:54.990 回答
0

您可以使用此 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();
于 2021-06-21T21:13:42.143 回答