10

QTreeView行の内容に応じて、行の異なる背景色が必要です。これを実現するために、次のようにclass MyTreeViewfromを派生QTreeViewさせ、ペイント メソッドを実装しました。

    void MyTreeView::drawRow (QPainter* painter,
                              const QStyleOptionViewItem& option,
                              const QModelIndex& index) const
    {
      QStyleOptionViewItem newOption(option);

      if (someCondition)
      {
        newOption.palette.setColor( QPalette::Base, QColor(255, 0, 0) );
        newOption.palette.setColor( QPalette::AlternateBase, QColor(200, 0, 0) );
      }
      else
      {
        newOption.palette.setColor( QPalette::Base, QColor(0, 0, 255) );
        newOption.palette.setColor( QPalette::AlternateBase, QColor(0, 0, 200) );
      }

      QTreeView::drawRow(painter, newOption, index);
    }

最初にsetAlternatingRowColors(true);、QTreeView を設定しました。

私の問題: QPalette::Baseの色を設定しても効果がありません。2 行おきに白のままです。

ただし、QPalette::AlternateBase の設定は期待どおりに機能します。私は試してみましたが、何の効果もsetAutoFillBackground(true)ありsetAutoFillBackground(false)ませんでした。

この問題を解決するヒントはありますか? ありがとうございました。


注意:適応して色を設定しても、望ましい結果は得MyModel::data(const QModelIndex&, int role)られQt::BackgroundRoleません。この場合、背景色は行の一部にのみ使用されます。しかし、ツリー ナビゲーションの左側を含め、行全体に色を付けたいと思います。

Qt バージョン: 4.7.3


更新: 理由は不明QPalette::Baseですが、不透明なようです。setBrush はそれを変更しません。次の回避策を見つけました。

    if (someCondition)
    {
        painter->fillRect(option.rect, Qt::red);
        newOption.palette.setBrush( QPalette::AlternateBase, Qt::green);
    }
    else
    {
        painter->fillRect(option.rect, Qt::orange);
        newOption.palette.setBrush( QPalette::AlternateBase, Qt:blue);
    }
4

3 に答える 3

9

唯一の問題が、展開/折りたたみコントロールに行の残りの部分のような背景がないことである場合は、モデルを使用Qt::BackgroundRoleして( pnezisの回答で説明されているように)、これをツリービュークラスに追加します。::data()

void MyTreeView::drawBranches(QPainter* painter,
                              const QRect& rect,
                              const QModelIndex& index) const
{
  if (some condition depending on index)
    painter->fillRect(rect, Qt::red);
  else
    painter->fillRect(rect, Qt::green);

  QTreeView::drawBranches(painter, rect, index);
}

Qt 4.8.0を使用してWindows(Vistaおよび7)でこれをテストしましたが、矢印の展開/折りたたみには適切な背景があります。問題は、これらの矢印がビューの一部であるため、モデルで処理できないことです。

于 2013-01-13T02:05:58.623 に答える
7

サブクラス化する代わりにQTreeView、モデルを通じて背景色を処理する必要があります。data()関数とを使用してQt::BackgroundRole、行の背景色を変更します。

QVariant MyModel::data(const QModelIndex &index, int role) const
{
   if (!index.isValid())
      return QVariant();

   if (role == Qt::BackgroundRole)
   {
       if (condition1)
          return QColor(Qt::red);
       else
          return QColor(Qt::green); 
   }

   // Handle other roles

   return QVariant();
}
于 2013-01-10T11:15:33.580 に答える