我一直在使用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();