2009-09-09 23 views
5

(各行に関連するデータに応じて)カスタム色を使用してQTreeViewウィジェットの列の1つにテキストを描画したいと考えています。これが動作するようには思えないので、私がしようとした(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); 
} 

しかし、明らかに、私は何かが欠けています:私はdrawRow()保護されたメソッドをオーバーロードして、このようなスタイルのオプションパラメータ(削ぎ落とした例)を変更しようとしました色役割も 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ýはい、コンテンツと外観を別々に扱う(モデルとデリゲート)ために、外観に使うべきではないと考える純粋主義者もいます。 – neuronet

関連する問題