Zmiana koloru tła wiersza QTreeView nie działa
mamQTreeView
i chcą różnych kolorów tła dla wierszy, w zależności od ich zawartości. Aby to osiągnąć, wyprowadziłemclass MyTreeView
zQTreeView
i zaimplementował metodę malowania w następujący sposób:
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);
}
Początkowo ustawiłemsetAlternatingRowColors(true);
dla QTreeView.
Mój problem: Ustawianie koloru dlaQPalette :: Baza nie działa. Co drugi rząd pozostaje biały.
Jednak ustawienieQPalette :: AlternateBase działa zgodnie z oczekiwaniami. próbowałemsetAutoFillBackground(true)
isetAutoFillBackground(false)
bez żadnego efektu.
Czy są jakieś wskazówki, jak rozwiązać ten problem? Dziękuję Ci.
Uwaga: Ustawianie koloru przez dostosowanieMyModel::data(const QModelIndex&, int role)
dlaQt::BackgroundRole
nie zapewnia pożądanego rezultatu. W tym przypadku kolor tła jest używany tylko dla części wiersza. Ale chcę pokolorować pełny wiersz, łącznie z lewą stroną, z elementami nawigacji drzewa.
Wersja Qt: 4.7.3
Aktualizacja: Z nieznanych powodówQPalette::Base
wydaje się nieprzejrzysty. setBrush tego nie zmienia. Znalazłem następujące obejście:
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);
}