2009-09-09 5 views
5

Ich möchte Texte in einer der Spalten in einem QTreeView-Widget mit einer benutzerdefinierten Farbe (abhängig von den Daten für jede Zeile) zeichnen. Ich versuchte, die drawRow() geschützte Methode, um eine Überlastung und den Stil Option Parameter wie folgt ändern (eine abgespeckte Beispiel):Benutzerdefinierte Textfarbe für bestimmte Indizes in QTreeView

virtual void drawRow(QPainter* p_painter, const QStyleOptionViewItem& option, 
        const QModelIndex& index) const 
{ 
    QStyleOptionViewItem optionCustom = option; 
    if (index.column() == 2) 
    { 
     optionCustom.palette.setColor(QPalette::Text, Qt::red); 
    } 
    QTreeView::drawRow(p_painter, optionCustom, index); 
} 

Aber offensichtlich ich etwas, weil dies fehle scheint nicht zu funktionieren (ich versuchte, ändere auch die QPalette::WindowText Farbrolle).

Antwort

10

Erweitern Sie in Ihrem Modell die Funktion data(), um eine bestimmte Farbe als Qt::ForegroundRole-Rolle zurückzugeben.

Zum Beispiel:

virtual QVariant MyModel::data(const QModelIndex &index, int role) const 
{ 
    if (index.isValid() && role == Qt::ForegroundRole) 
    { 
     if (index.column() == 2) 
     { 
      return QVariant(QColor(Qt::red)); 
     } 
     return QVariant(QColor(Qt::black)); 
    } 

    return QAbstractItemModel::data(index, role); 
} 
+0

Dank! Ich wusste nicht, dass die Methode 'data()' auch für das Aussehen des Objekts verwendet wird. Ich implementierte, was ich wollte, mit einem benutzerdefinierten Item-Delegaten, mit einer überschriebenen 'paint()' Methode, aber mit der 'data()' Methode ist immer so viel eleganter. –

+0

@ VladoKlimovský ja, aber es gibt einige Puristen, die nicht denken, dass es für das Aussehen verwendet werden sollte, wie sie wollen, dass Inhalt und Aussehen separat behandelt werden (Modell vs Delegat). – neuronet