2009-09-09 41 views
5

我想使用自定義顏色(取決於與每行相關的數據)在QTreeView小部件中的某一列中繪製文本。我試圖重載drawRow()保護的方法和改變風格選項參數是這樣的(一個精簡的例子):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); 
} 

但很明顯,我失去了一些東西,因爲這似乎並沒有工作(我試着改變顏色角色QPalette::WindowText)。

回答

10

在您的模型中,擴展data()函數以返回給定顏色作爲Qt::ForegroundRole角色。

例如:

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

謝謝!我不知道'data()'方法也用於項目的外觀。我用一個重寫的paint()方法實現了我想要使用自定義項目委託,但使用'data()'方法更優雅。 –

+0

@VladoKlimovský是的,但也有一些純粹主義者認爲它不應該用於外觀,因爲他們希望分別處理內容和外觀(模型vs委託)。 – neuronet

相關問題