у меня есть 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);
}
Если единственная проблема заключается в том, что у раскрывающихся / сворачивающихся элементов управления нет фона, как у остальной части строки, используйте 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, и стрелки расширения / свертывания имеют надлежащий фон. Проблема заключается в том, что эти стрелки являются частью вида и, следовательно, не могут быть обработаны в модели.
Вместо подклассов 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();
}
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());
}