Я думаю, что эта проблема связана с индивидуальным решением (которое я считаю каким-то неправильным), но я предпочитаю спросить здесь, прежде чем отправлять отчет о возможной ошибке.
У меня есть 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_())
На следующем изображении вы видите начальную точку, примененную к четырем различным подходам. Палитра (примененная к приложению) является последовательной.
Если я выберу другой цвет для палитры (оба Text
и Link
) Я ожидаю, что будет применен как цвет шрифта по умолчанию , так и , по крайней мере для тех виджетов, которые используют эту настройку палитры. К сожалению, это происходит только в последнем виджете, который использует текущую palette.text().color().getRgb()
для таблицы стилей документа по умолчанию, и он работает только для новой привязки.
В этот момент мы можем ожидать результата всякий раз, когда я снова меняю цвет на синий:
Опять же, цвет текста по умолчанию правильныйприменяется ко всем виджетам QTextEdit, но работает только для последней ссылки, добавленной к последнему текстовому редактору.
После нескольких простых toHtml()
проверок всех виджетов и просмотра источников Qt я понял, что всякий раз, когда новыйдобавлен якорь, фактический HTML-код встраивает стиль текста якорного текста (вместо того, чтобы оставить текстовый формат с настройками по умолчанию и переопределить его, если он указан).
Пока я будувероятно, представьте отчет, как написано в начале, я знаю, что потребуется некоторое время, прежде чем это будет принято во внимание и окончательно (если вообще) исправлено.
Итак,вопрос: я что-то упускаю / что-то делаю не так, или есть способ избежать такого поведения и убедиться, что все неформатированные якоря действительно используют набор палитры для виджета (или приложения)?
Очевидно, я не говорю о разборе / исправлении существующего кода вручную.