Моноширинный подробный текст в QMessageBox
Я использовал QMessageBox
отображать результаты статистического теста. Это хорошо, потому что я могу поместить итоговый результат в информативный текст, а затем полный результат в детальный текст. Проблема в том, что полный результат - это таблица, поэтому я бы хотел, чтобы она была моноширинной, чтобы она выглядела правильно, и QMessageBox
не использует моноширинный шрифт в области детального текста.
Так что я смотрю на подклассы QMessageBox
или подкласс QDialog
сделать что-то похожее на QMessageBox
но использует моноширинный шрифт в области детального текста. В данный момент я немного заржавел, и мне трудно понять, какой вариант лучше. Могу ли я подкласс QMessageBox
Просто добавьте мой собственный QTextEdit
и мою собственную кнопку "показать подробный текст", и оставить QMessageBox
детальная текстовая область и кнопка скрыты? Или есть какой-то более простой способ сделать это?
4 ответа
Я не нашел лучше, чем это:
setStyleSheet("QTextEdit { font-family: monospace; }");
Это немного странно, потому что (1) он использует таблицы стилей, которые могут конфликтовать с вашим стилем оформления виджета, и (2) он опирается на тот факт, что подробный текст находится в QTextEdit
и является единственным таким элементом, который официально не обеспечивается API. Но это работает.:D
Вы можете использовать HTML-текст в полях QMessageBox, это будет самый простой способ. Как подсказка, попробуйте положить
<pre>Test</pre>
в вашей QString.
Любая другая настройка окна сообщения, вероятно, подразумевает подкласс.
Вот рабочий пример, основанный на ответе Лити:
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()
Вы можете использовать html-текст в подробном тексте QMessageBox, используя этот прием:
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();