2009-09-09 15 views
5

Bir QTreeView widget'ındaki sütunlardan birinde özel bir renk kullanarak (her satırla ilgili verilere bağlı olarak) metin çizmek istiyorum. Ben drawRow() korumalı yöntemi aşırı ve bunun gibi stil seçeneği parametre (sadeleştirilmiş örnek) değiştirmeye çalıştı:QTreeView içinde belirli dizinler için özel metin rengi

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); 
} 

Ama açıkçası ben bu çünkü şey eksik çalışmak görünmüyor (Denedim QPalette::WindowText renk rolünü de değiştirin).

cevap

10

Modelinizde, verilen bir rengi Qt::ForegroundRole rolü olarak döndürmek için data() işlevini genişletin. Örneğin

:

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

teşekkürler! 'Data()' yönteminin öğenin görünümü için de kullanıldığını bilmiyordum. Özel bir item delegesi kullanarak istediğim şeyi, bir 'paint()' yöntemiyle geçersiz kıldım, ancak 'data() yöntemini kullanarak, bu yöntem çok daha şık. –

+0

@ VladoKlimovský evet ama görünüşe göre içerik ve görünümün ayrı ele alınmasını istedikleri için (modele karşı delege) görünüm için kullanılması gerektiğini düşünmeyen bazı püristler var. – neuronet