Das Ändern der Zeilenhintergrundfarbe eines QTreeView funktioniert nicht

Ich habe einQTreeView und möchten unterschiedliche Hintergrundfarben für Zeilen, abhängig von deren Inhalt. Um dies zu erreichen, leitete ich einclass MyTreeView vonQTreeView und implementierte die Malmethode wie folgt:

    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);
    }

Anfangs habe ich gesetztsetAlternatingRowColors(true); für den QTreeView.

Mein Problem: Einstellen der Farbe fürQPalette :: Base hat keine Auswirkung. Jede zweite Reihe bleibt weiß.

Einstellung jedochQPalette :: AlternateBase funktioniert wie erwartet. Ich habe es versuchtsetAutoFillBackground(true) undsetAutoFillBackground(false) ohne Wirkung.

Gibt es Hinweise zur Lösung dieses Problems? Vielen Dank.

Anmerkung: Einstellen der Farbe durch AnpassenMyModel::data(const QModelIndex&, int role) zumQt::BackgroundRole liefert nicht das gewünschte Ergebnis. In diesem Fall wird die Hintergrundfarbe nur für einen Teil der Zeile verwendet. Aber ich möchte die ganze Zeile einfärben, einschließlich der linken Seite mit dem Baumnavigationsmaterial.

Qt Version: 4.7.3

Aktualisieren: Aus unbekannten GründenQPalette::Base scheint undurchsichtig zu sein. setBrush ändert das nicht. Ich habe die folgende Problemumgehung gefunden:

    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);
    }

Antworten auf die Frage(3)

Ihre Antwort auf die Frage