Как изменить (удалить) выделение / активный цвет QListWidget
В моем QListWidget
Есть некоторые элементы, которые имеют цвет фона не по умолчанию, я установил их так, как в обычай QListWidget
учебный класс:
item->setBackgroundColor(qcolor); // item is of type QListWidgetItem*
Те цвета не по умолчанию, которые я установил, искажаются QListWidget
Подбор цвета. Смотрите пример:
Предметы three
а также four
должны быть одного цвета, но они не являются предметом four
и, таким образом, результирующий цвет является суммой исходного цвета и QListWidget
Выбор цвета (активный элемент?).
Мой вопрос, как изменить или удалить этот цвет выделения?
Я попробовал внутри QListWidget
(в специальном слоте, когда я хочу изменить цвет фона элемента):
QPalette pal = this->palette();
pal.setColor(QPalette::Highlight, QColor(255,255,255,0));
this->setPalette(pal); // updated
Но это не дало никакого эффекта. Что я делаю неправильно? Это правильная переменная для установки? Я установил это внутри QListWidget
или внутри своего делегата?
Обновление: я попытался использовать таблицы стилей, как указано в комментарии / ответе, однако, я не смогу использовать их для моего приложения, потому что элементы в моих строках имеют 3 состояния (поэтому мне нужно будет использовать три цвета). Например, 3 состояния, которые соответствуют трем цветам: розовый для активного, зеленый для неактивного и серый для остальных. При использовании таблиц стилей я не могу установить пользовательское свойство (скажем, QListWidget::item[Inactive="true"]
) в одиночку QListWidgetItem
, но для полного QListWidget
и, следовательно, он окрашивает все строки в один цвет.
Таблицы стилей были опробованы здесь для аналогичной проблемы, и они не работали, поэтому я делаю вывод, что использование таблиц стилей не является подходящим способом.
Метод изменения фона, который я использовал изначально, отлично подходит для моих целей, но я не могу понять, как избавиться от цвета выделения по умолчанию (прозрачный светло-синий), который добавляет цвет фона и создает смешанный цвет.
2 ответа
Я нашел подходящее решение с помощью делегата. Таким образом, нет необходимости использовать QPalette
; и для моей проблемы таблицы стилей не будут работать. Это решение также будет работать, когда разные строки (QListWidget
или же QTreeWidget
) должны быть окрашены в разные цвета, в зависимости от состояния.
Цвет фона устанавливается так, как описано в вопросе:
item->setBackgroundColor(qcolor); // change color slot inside QListWidget class
Чтобы определить правила написания виджета, я переопределил делегат:
class Delegate : public QStyledItemDelegate {};
Тогда я переопределить Delegate
метод paint()
, Там я определяю, как нарисовать каждую строку моего виджета. Более конкретно, я вызываю пользовательский рисунок только тогда, когда мышь находится над элементом или этот элемент находится в выбранном состоянии (это те условия, когда строка выбирается голубым цветом, которого я хочу избежать). Код выглядит так:
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if((option.state & QStyle::State_Selected) || (option.state & QStyle::State_MouseOver))
{
// get the color to paint with
QVariant var = index.model()->data(index, Qt::BackgroundRole);
// draw the row and its content
painter->fillRect(option.rect, var.value<QColor>());
painter->drawText(option.rect, index.model()->data(index, Qt::DisplayRole).toString());
}
else
QStyledItemDelegate::paint(painter, option, index);
// ...
}
Конечно, не забудьте связать QListWidget
с Delegate
:
listWidget->setItemDelegate(new Delegate());
Я думаю, вам лучше использовать таблицы стилей для этого. Вот пример
QListWidget::item
{
background: rgb(255,255,255);
}
QListWidget::item:selected
{
background: rgb(128,128,255);
}
::item
указывает отдельные элементы в QListWidget, в то время как :selected
указывает на QListWidgetItems, которые в данный момент выбраны.
Чтобы затем получить собственный фон для определенных виджетов, вы можете использовать свойства таблицы стилей. В своем коде вызовите что-то вроде этого в виджете, к которому вы хотите применить собственный стиль:
myList->setProperty( "Custom", "true" );
// Updates the style.
style->unpolish( myList );
style->polish( myList );
Затем в таблице стилей определите стиль для своего пользовательского свойства следующим образом.
QListWidget::item[Custom="true"]
{
background: rgb(128,255,128);
}