2009-09-09 36 views
5

Me gustaría dibujar textos en una de las columnas en un widget QTreeView utilizando un color personalizado (dependiendo de los datos relacionados con cada fila). Traté de sobrecargar el drawRow() método protegido y cambiar el parámetro de opción de estilo como esto (un ejemplo sin accesorios):Color de texto personalizado para ciertos índices en 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); 
} 

Pero obviamente me falta algo porque esto no parece funcionar (Intenté cambie también la función de color QPalette::WindowText).

Respuesta

10

En su modelo, amplíe la función data() para devolver un color determinado como el rol Qt::ForegroundRole.

Por ejemplo:

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

Gracias! No sabía que el método 'data()' se usa también para la apariencia del elemento. Implementé lo que quería usando un delegado de elementos personalizados, con un método 'paint()' anulado, pero usar el método 'data()' es mucho más elegante. –

+0

@ VladoKlimovský sí, pero hay algunos puristas que no creen que deba usarse para la apariencia, ya que quieren que el contenido y la apariencia se manejen por separado (modelo frente a delegado). – neuronet

Cuestiones relacionadas