Моноширинный подробный текст в 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();
Другие вопросы по тегам