2010-09-08 1 views
1

Использование Qt 4.6.3 для Linux/X11.Отображение QStandardItem с его цветом переднего плана в QTreeView, даже если оно выбрано.

У меня есть виджет QTreeView, который использует QStandardItemModel в качестве своей модели с 4 столбцами и сотнями строк. Большинство элементов в списке должны отображаться со стандартным цветом, но некоторые из них должны быть другого цвета. Я могу легко изменить цвета этих элементов с помощью QStandardItem :: setForeground().

Тем не менее, это влияет только на цвет предмета, когда он равен не выбран. Когда я выбираю цветной элемент, его цвет фона меняется на синий (это нормально), а цвет текста меняется на белый (что не совсем нормально). Я попытался использовать таблицу стилей, чтобы повлиять на цвет переднего плана для выбранных элементов (с выбором селектора QTreeView :: item: selected), но он влияет на все элементов.

Мне нужны элементы, для которых я звонил item->setForeground(Qt::red), чтобы оставаться красным даже в том случае, если они выбраны, и другие элементы, чтобы использовать набор цветов по умолчанию (что они уже делают). Как это можно сделать?

+0

Если вы достигнете этого, вы, вероятно, сделаете выбранные элементы нечитаемыми. Кроме того, хорошая практика проектирования заключается в том, чтобы использовать больше, чем просто цвет, чтобы указать состояние. Может быть, вы могли бы использовать значок вместо этого? –

+0

@Steve S: Я знаю, что вы имеете в виду, но я не буду отображать выбранные элементы нечитабельно, если я также контролирую цвет фона выбранных элементов (учитывая слепоту цвета), что и происходит. И, к сожалению, в этой конкретной ситуации я не могу использовать значок, он должен быть цветным. – Fred

ответ

3

Используемые цвета (я предполагаю) для QPaletteHightlight и HighlightedText ролей. К сожалению, я не знаю, как установить их на отдельный стандартный элемент.

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

+0

Да, сделайте пользовательский делегат, вот для чего они предназначены. – neuronet