Измените цвет текста виджета по умолчанию с помощью применяемой таблицы стилей элементов QTreeWidget

У меня есть QTreeWidget (однако этот вопрос относится к любому виду виджета), в котором у меня есть элементы, которые при определенных обстоятельствах меняют свой цвет переднего плана на красный с помощью item.setForeground(0,QBrush(QColor("red"))).

Позже они могут снова изменить цвет переднего плана на черный. Но проблема в том, что если для виджета была установлена ​​какая-то таблица стилей, которая изменила цвет переднего плана на отличный от черного, у меня проблемы. Мой вопрос в том, как вернуть цвет элемента к цвету по умолчанию, используемому виджетом для цвета текста с учетом примененных таблиц стилей?

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

Я пробовал это:

1) если я использую item.setForeground(QtGui.QBrush()), который, как я надеялся, будет использовать пустую кисть по умолчанию, я всегда получаю черный текст

2) если я запрашиваю цвет текста treeWidget.palette().text().color(), я всегда получаю один и тот же цвет независимо от таблицы стилей


person V.K.    schedule 16.11.2016    source источник
comment
Боюсь, я немного задал вопрос XY ... Моя цель состояла в том, чтобы просто сбросить цвет переднего плана, но мои попытки с setForeground() позволили мне уйти от правильного и простейшего решения (предложенного ekhumoro ниже), чтобы покопаться в таблицах стилей и т. Д. :)   -  person V.K.    schedule 17.11.2016


Ответы (1)


Этот вопрос на самом деле не относится к «любому виду виджета», потому что нет гарантии, что установка цвета переднего плана всегда будет работать. Процитируем документы для QPalette:

Предупреждение. Некоторые стили не используют палитру для всего рисунка, например, если они используют собственные механизмы тем. Это относится как к стилям Windows XP, Windows Vista, так и к Mac OS X.

Однако, если вопрос ограничен элементами модели (например, QTreeWidgetItem), вы можете очистить текущие настройки следующим образом:

item.setData(column, QtCore.Qt.ForegroundRole, None)

На платформах, которые разрешают изменения с помощью палитры, вы можете получить палитру по умолчанию следующим образом:

palette = QtGui.qApp.style().standardPalette()

который затем должен позволить вам восстановить исходные значения.

person ekhumoro    schedule 16.11.2016
comment
Это item.setData(...), похоже, решает мою проблему, в отличие от item.setForeground(), которым я пользовался. На самом деле я наконец нашел другой способ: переопределить метод MyTreeItem.data(column, role), чтобы вернуть None для роли переднего плана. Но setData(...) кажется более элегантным вариантом, потому что он не требует определения моего собственного класса элементов. - person V.K.; 17.11.2016