2009-09-09 13 views
5

Chciałbym narysować teksty w jednej z kolumn w widgecie QTreeView przy użyciu niestandardowego koloru (w zależności od danych związanych z każdym wierszem). Starałem się przeciążać drawRow() metoda chronione i zmienić parametr opcji styl tak (okrojoną przykład):Niestandardowy kolor tekstu dla niektórych indeksów w 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); 
} 

Ale oczywiście ja czegoś brakuje, ponieważ nie wydaje się działać (próbowałem zmień także rolę koloru na QPalette::WindowText).

Odpowiedz

10

W swoim modelu rozszerz funkcję data(), aby zwrócić wybrany kolor jako rolę Qt::ForegroundRole.

Na przykład:

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

Dzięki! Nie wiedziałem, że metoda 'data()' jest używana również do wyglądu przedmiotu. Zaimplementowałem to, co chciałem, używając niestandardowego elementu delegowanego, z przesłoniętą metodą 'paint()', ale użycie metody 'data()' jest jeszcze bardziej eleganckie. –

+0

@ VladoKlimovský tak, ale jest kilku purystów, którzy nie sądzą, że powinny być używane do wyglądu, ponieważ chcą, aby treść i wygląd były traktowane osobno (model kontra delegat). – neuronet

Powiązane problemy