Как изменить (удалить) выделение / активный цвет 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);
}
Другие вопросы по тегам