Alterar a cor de fundo da linha de um QTreeView não funciona
eu tenho umQTreeView
e deseja cores de fundo diferentes para linhas, dependendo do conteúdo. Para conseguir isso, eu deduziclass MyTreeView
deQTreeView
e implementou o método de pintura da seguinte forma:
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);
}
Inicialmente, eu definisetAlternatingRowColors(true);
para o QTreeView.
Meu problema: Definir a cor paraQPalette :: Base não tem efeito. Cada segunda linha permanece branca.
No entanto, a configuraçãoQPalette :: AlternateBase funciona conforme o esperado. eu tenteisetAutoFillBackground(true)
esetAutoFillBackground(false)
sem qualquer efeito.
Há alguma sugestão de como resolver este problema? Obrigado.
Observação: Configurando a cor adaptandoMyModel::data(const QModelIndex&, int role)
paraQt::BackgroundRole
não fornece o resultado desejado. Nesse caso, a cor do plano de fundo é usada apenas para uma parte da linha. Mas eu quero colorir a linha completa, incluindo o lado esquerdo com o material de navegação da árvore.
Versão Qt: 4.7.3
Atualizar: Por razões desconhecidasQPalette::Base
parece ser opaca. setBrush não altera isso. Eu encontrei a seguinte solução alternativa:
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);
}