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

时间:2013-01-10 10:04:19

标签: c++ qt user-interface qtreeview

我有一个QTreeView,并希望行的背景颜色不同,具体取决于其内容。为实现这一目标,我从class MyTreeView派生了QTreeView并实现了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);
    }

最初,我为QTreeView设置了setAlternatingRowColors(true);

我的问题:设置 QPalette :: Base的颜色无效。每隔一行保持白色。

但是,设置 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);
    }

3 个答案:

答案 0 :(得分:9)

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

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

我在Windows(Vista和7)上使用Qt 4.8.0进行了测试,并且扩展/折叠箭头具有适当的背景。问题是这些箭头是视图的一部分,因此无法在模型中处理。

答案 1 :(得分:6)

您应该通过模型处理背景颜色,而不是继承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();
}

答案 2 :(得分:0)

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