2009-09-09 6 views
5

Je souhaite dessiner des textes dans l'une des colonnes d'un widget QTreeView en utilisant une couleur personnalisée (en fonction des données relatives à chaque ligne). J'ai essayé de surcharger le drawRow() méthode protégée et modifier le paramètre d'option de style comme celui-ci (un exemple stripped-down):Couleur de texte personnalisée pour certains index dans 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); 
} 

Mais évidemment je manque quelque chose parce que cela ne semble pas fonctionner (j'ai essayé de changez également le rôle de couleur QPalette::WindowText).

Répondre

10

Dans votre modèle, étendez la fonction data() pour renvoyer une couleur donnée au rôle Qt::ForegroundRole.

Par exemple:

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

Merci! Je ne savais pas que la méthode 'data()' est aussi utilisée pour l'apparence de l'objet. J'ai implémenté ce que je voulais en utilisant un délégué d'item personnalisé, avec une méthode 'paint()' remplacée, mais l'utilisation de la méthode 'data()' est toujours plus élégante. –

+0

@ VladoKlimovský Oui, mais il y a des puristes qui ne pensent pas qu'il devrait être utilisé pour l'apparence, car ils veulent que le contenu et l'apparence soient traités séparément (modèle vs délégué). – neuronet

Questions connexes