Изменение цвета фона строки в QTreeView не работает

у меня есть QTreeView и хотите разные цвета фона для строк, в зависимости от их содержимого. Чтобы добиться этого, я вывел class MyTreeView от QTreeView и реализовал метод рисования следующим образом:

    void MyTreeView::drawRow (QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
QStyleOptionViewItem newOption(option);

if (someCondition)
{
newOption.palette.setColor( QPalette::Base, QColor(255, 0, 0) );
newOption.palette.setColor( QPalette::AlternateBase, QColor(200, 0, 0) );
}
else
{
newOption.palette.setColor( QPalette::Base, QColor(0, 0, 255) );
newOption.palette.setColor( QPalette::AlternateBase, QColor(0, 0, 200) );
}

QTreeView::drawRow(painter, newOption, index);
}

Изначально я установил setAlternatingRowColors(true); для QTreeView.

Моя проблема: Установка цвета для QPalette :: Base не имеет никакого эффекта. Каждый второй ряд остается белым.

Однако настройка QPalette :: AlternateBase работает как положено.
Я старался setAutoFillBackground(true) а также setAutoFillBackground(false) без какого-либо эффекта.

Есть ли подсказки, как решить эту проблему? Спасибо.


Примечание: Настройка цвета путем адаптации MyModel::data(const QModelIndex&, int role) за Qt::BackgroundRole не дает желаемого результата. В этом случае цвет фона используется только для части строки. Но я хочу раскрасить всю строку, включая левую сторону, с помощью дерева навигации.

Версия Qt: 4.7.3


Обновить:
По неизвестным причинам QPalette::Base кажется непрозрачным.
setBrush не меняет этого.
Я нашел следующий обходной путь:

    if (someCondition)
{
painter->fillRect(option.rect, Qt::red);
newOption.palette.setBrush( QPalette::AlternateBase, Qt::green);
}
else
{
painter->fillRect(option.rect, Qt::orange);
newOption.palette.setBrush( QPalette::AlternateBase, Qt:blue);
}

8

Решение

Если единственная проблема заключается в том, что у раскрывающихся / сворачивающихся элементов управления нет фона, как у остальной части строки, используйте Qt::BackgroundRole в ::data() вашей модели (как описано pnezis в их ответ) и добавьте это в свой класс дерева:

void MyTreeView::drawBranches(QPainter* painter,
const QRect& rect,
const QModelIndex& index) const
{
if (some condition depending on index)
painter->fillRect(rect, Qt::red);
else
painter->fillRect(rect, Qt::green);

QTreeView::drawBranches(painter, rect, index);
}

Я проверил это на Windows (Vista и 7), используя Qt 4.8.0, и стрелки расширения / свертывания имеют надлежащий фон. Проблема заключается в том, что эти стрелки являются частью вида и, следовательно, не могут быть обработаны в модели.

9

Другие решения

Вместо подклассов QTreeView Вы должны обрабатывать цвет фона через вашу модель. Использовать data() функция и Qt::BackgroundRole для изменения цвета фона строк.

QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

if (role == Qt::BackgroundRole)
{
if (condition1)
return QColor(Qt::red);
else
return QColor(Qt::green);
}

// Handle other roles

return QVariant();
}
5

https://www.linux.org.ru/forum/development/4702439

if ( const QStyleOptionViewItemV4* opt = qstyleoption_cast<const QStyleOptionViewItemV4*>(&option) )
{
if (opt.features & QStyleOptionViewItemV4::Alternate)
painter->fillRect(option.rect,option.palette.alternateBase());
else
painter->fillRect(option.rect,painter->background());
}
0
По вопросам рекламы [email protected]