У меня есть 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);
}