2009-09-09 4 views
5

Vorrei disegnare i testi in una delle colonne in un widget QTreeView utilizzando un colore personalizzato (in base ai dati relativi a ciascuna riga). Ho cercato di sovraccaricare il drawRow() metodo protetto e modificare il parametro opzione di stile come questo (un esempio ridotto all'osso):Colore testo personalizzato per determinati indici 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); 
} 

Ma ovviamente mi manca qualcosa perché questo non sembra funzionare (ho cercato di cambiare anche il ruolo di colore QPalette::WindowText).

risposta

10

Nel modello, estendere la funzione data() per restituire un determinato colore come ruolo Qt::ForegroundRole.

Ad esempio:

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

Grazie! Non sapevo che il metodo 'data()' è usato anche per l'aspetto dell'oggetto. Ho implementato ciò che volevo usando un oggetto delegato personalizzato, con un metodo 'paint()' sovrascritto, ma usare il metodo 'data()' è sempre molto più elegante. –

+0

@ VladoKlimovský sì ma ci sono alcuni puristi che non pensano che dovrebbe essere usato per l'aspetto, in quanto vogliono che il contenuto e l'aspetto siano gestiti separatamente (modello vs delegato). – neuronet