10

我有一个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)没有任何效果。

是否有任何提示如何解决这个问题?谢谢你。


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

于 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 回答
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());
}
于 2017-03-17T04:46:10.533 回答