更改QTreeView的行背景颜色不起作用

我有一个QTreeView并根据其内容需要不同的行背景颜色。 为了达到这个目的,我从QTreeView派生了一个class MyTreeViewQTreeView如下方式实现了paint方法:

    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的颜色没有效果 。 每隔一行保持白色。

但是,设置QPalette :: AlternateBase按预期工作 。 我尝试setAutoFillBackground(true)setAutoFillBackground(false)没有任何效果。

有什么提示如何解决这个问题? 谢谢。


备注:通过为Qt::BackgroundRole调整MyModel::data(const QModelIndex&, int role)来设置颜色并不能提供所需的结果。 在这种情况下,背景色仅用于行的一部分。 但是我想对整行进行着色,包括左侧的树状导航内容。

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

如果唯一的问题是扩展/折叠控件没有像行的其余部分一样的背景,那么在你的模型中使用Qt::BackgroundRole ::data() (如他们的答案中的pnezis所述),并将其添加到你的树视图类:

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)上测试了这个,并且展开/折叠箭头具有适当的背景。 问题是这些箭头是视图的一部分,因此无法在模型中处理。


而不是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();
}

https://www.linux.org.ru/forum/development/4702439

if ( const QStyleOptionViewItemV4* opt = qstyleoption_cast<const QStyleOptionViewItemV4*>(&option) )
{
        if (opt.features & QStyleOptionViewItemV4::Alternate)
            painter->fillRect(option.rect,option.palette.alternateBase());
        else
            painter->fillRect(option.rect,painter->background());
}
链接地址: http://www.djcxy.com/p/87631.html

上一篇: Changing the row background color of a QTreeView does not work

下一篇: QTextEdit background color change also the color of scrollbar