Обновление цвета якорей по умолчанию в QTextDocument - PullRequest
1 голос
/ 09 ноября 2019

Я думаю, что эта проблема связана с индивидуальным решением (которое я считаю каким-то неправильным), но я предпочитаю спросить здесь, прежде чем отправлять отчет о возможной ошибке.

У меня есть QTextEdit, которыйнаследует палитру родительского окна для своих цветов шрифта по умолчанию, и эта палитра может измениться на ходу, если пользователь захочет изменить цвета этого окна редактирования текста.

Хотя это нормально работает для стандартного текста, существуетпроблема с цветами QPalette.Link: как только я изменяю свойство палитры Text, неотформатированный текст корректно обновляется, но если я изменяю свойство Link, результат не будет работать должным образом.

from PyQt5 import QtWidgets

class Test(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        layout = QtWidgets.QGridLayout(self)
        paletteBtn = QtWidgets.QPushButton('Set palette')
        paletteBtn.clicked.connect(self.selectPalette)

        palette = self.palette()
        palette.setColor(palette.Link, palette.color(palette.Text))
        QtWidgets.QApplication.setPalette(palette)

        self.textEdits = []

        self.baseEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.baseEdit, 1, 0)

        self.preTextEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.preTextEdit, 1, 1)

        self.paletteTextEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.paletteTextEdit, 1, 2)

        self.staticTextEdit = QtWidgets.QTextEdit()
        layout.addWidget(self.staticTextEdit, 1, 3)

        for textEditName in ('baseEdit', 'preTextEdit', 'paletteTextEdit', 'staticTextEdit'):
            textEdit = getattr(self, textEditName)
            self.textEdits.append(textEdit)
            textEdit.setHtml('''
                <html>
                    <body>
                        <b>{}</b><br/>
                        simple text<br/>
                        <a href="link">unformatted link!</a>
                    </body>
                </html>
            '''.format(textEditName))

        self.preTextEdit.document().setDefaultStyleSheet('a {color: green;}')

        layout.addWidget(paletteBtn, 0, 0, 1, layout.columnCount())

    def selectPalette(self):
        palette = self.palette()
        new = QtWidgets.QColorDialog.getColor(palette.color(palette.Text), self)
        palette.setColor(palette.Text, new)
        palette.setColor(palette.Link, new)
        for textEdit in self.textEdits:
            if textEdit == self.paletteTextEdit:
                self.paletteTextEdit.document().setDefaultStyleSheet('a {color: palette(text);')
            elif textEdit == self.staticTextEdit:
                self.staticTextEdit.document().setDefaultStyleSheet('a {{color: rgb{};}}'.format(
                    palette.text().color().getRgb()))
            textEdit.setPalette(palette)
            cursor = textEdit.textCursor()
            cursor.movePosition(cursor.End)
            textEdit.setTextCursor(cursor)
            textEdit.insertHtml('<br/><a href="link">another link!</a>')


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test = Test()
    test.show()
    sys.exit(app.exec_())

На следующем изображении вы видите начальную точку, примененную к четырем различным подходам. Палитра (примененная к приложению) является последовательной.

start situation

Если я выберу другой цвет для палитры (оба Text и Link) Я ожидаю, что будет применен как цвет шрифта по умолчанию , так и , по крайней мере для тех виджетов, которые используют эту настройку палитры. К сожалению, это происходит только в последнем виджете, который использует текущую palette.text().color().getRgb() для таблицы стилей документа по умолчанию, и он работает только для новой привязки.

red color applied

В этот момент мы можем ожидать результата всякий раз, когда я снова меняю цвет на синий:

blue color applied

Опять же, цвет текста по умолчанию правильныйприменяется ко всем виджетам QTextEdit, но работает только для последней ссылки, добавленной к последнему текстовому редактору.

После нескольких простых toHtml() проверок всех виджетов и просмотра источников Qt я понял, что всякий раз, когда новыйдобавлен якорь, фактический HTML-код встраивает стиль текста якорного текста (вместо того, чтобы оставить текстовый формат с настройками по умолчанию и переопределить его, если он указан).

Пока я будувероятно, представьте отчет, как написано в начале, я знаю, что потребуется некоторое время, прежде чем это будет принято во внимание и окончательно (если вообще) исправлено.
Итак,вопрос: я что-то упускаю / что-то делаю не так, или есть способ избежать такого поведения и убедиться, что все неформатированные якоря действительно используют набор палитры для виджета (или приложения)?
Очевидно, я не говорю о разборе / исправлении существующего кода вручную.

...