如何更改QTreeView标头(又名QHeaderView)的背景颜色?

时间:2011-09-08 02:55:18

标签: python qt user-interface pyqt paint

我正在尝试更改某些标题部分的背景颜色。有些人会使用默认颜色,有些会使用不同的颜色。

HeaderView不接受像QTreeView那样的委托;它完成了所有绘画本身。它使用两种方法 -

我最初的尝试是尝试覆盖paintSection,让它绘制默认的东西,然后添加我自己的东西。

def paintSection(self, painter, rect, logicalindex):
    QHeaderView.paintSection(self, painter, rect, logicalindex)
    painter.save()
    painter.fillRect(rect, QBrush(Qt.red))
    painter.restore()

这似乎没有做任何事情。它不会绘制填充的rect。如果我注释掉对基础paintSection方法的调用,它将绘制填充的rect,但不是非常一致(即单击并调整标题大小会导致它有时填充而不是其他)。

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

没有必要实现任何QHeaderView可以通过stylesheets像几乎所有小部件一样进行更改。

修改

您提到要根据数据更改每列的背景颜色,最简单的方法可能是从QAbstractItemModel或其他模型类派生新模型并重新实现headerData()调用

QVariant QAbstractItemModel::headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const [virtual]

您要作出反应的角色是Qt::BackgroundColorRole,因此该功能可能如下所示

QVariant VariableHeaderModel::headerData(int section Qt::Orientation orientation, int role)
{
  QVariant result;
  if (role == Qt::BackgroundColorRole)
  {
    result = <QColor from custom processing>
  }
  else
  {
    result = Superclass::headerData(section, orientation, role);
  }
  return result;
}

通常在Qt中,模型决定要显示的内容,几乎所有时间都会更改模型,而不是视图。 'data()'调用也被调用了很多,我不知道'headerData()',但如果有很多计算,你可能想要缓存任何结果。

如果您使用QStandardItemModel,可以直接拨打

setHeaderData(section, orientation, <aColor>, Qt::BackgroundColorRole);

答案 1 :(得分:0)

我认为你不需要覆盖任何东西。看看QWidget的palette属性。

答案 2 :(得分:0)

我同意“Harald Scheirich”样式表是要走的路。但也许为了说服你,我会告诉你一个名为Property Selectors的样式表中鲜为人知的部分

如果你看一下样式表文档here,你会看到一个关于它们的小部分。基本上我们正在做的是为具有特定属性集的那些小部件指定样式表。例如,所有QPushButtons都是平的。

QPushButton[flat="true"]
{
   background-color: blue
}

现在虽然这很酷,但就它本身来说它并没有真正帮助你。更令人惊奇的是,您可以将自己的属性添加到QObject中。这些被称为动态属性。这些也可用于属性选择器

所以我可以创建一个这样的样式表 - 其中highlightHeader是我的虚构属性

QHeaderView[highlightHeader="true"] 
{ 
   background-color: red
}

现在,您可以将此样式表全局应用于每个QHeaderView。但由于没有人将highlightHeader设置为true,因此我们不会在任何地方看到任何红色。所以下一步是当我们决定要将特定的QHeaderView设为红色时,我们称之为:

myHeaderView->setProperty("highlightHeader", true);
myHeaderView->style()->unpolish(myHeaderView);
myHeaderView->style()->polish(myHeaderView);

在第一行中,我们将属性设置为触发我们想要的状态。接下来的两行是为了确保Qt重新评估小部件的样式。否则你可能不会看到变化。

基本上就是这样。我希望有所帮助。