2009-09-09 42 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

相关问题