【问题标题】:How to change the background color for a QTreeView Header (aka QHeaderView)?如何更改 QTreeView Header(又名 QHeaderView)的背景颜色?
【发布时间】:2013-07-06 13:56:08
【问题描述】:

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

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

这似乎没有任何作用。它不会绘制填充的矩形。如果我注释掉对基本 paintSection 方法的调用,它将绘制填充的矩形,但不是很一致(即单击和调整标题的大小会导致它有时而不是其他的填充)。

感谢任何帮助。

【问题讨论】:

    标签: python qt user-interface pyqt paint


    【解决方案1】:

    无需实现任何东西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);
    

    【讨论】:

    • 样式表和调色板是样式的全局设置。我需要能够根据显示的数据动态更改样式(即背景颜色)。
    • 更新了一个解决方案,可以满足您的需求 Brendan
    • 谢谢! setHeaderData 解决方案完美运行。我已经在使用它来设置标题部分的文本。唯一的区别是我必须使用 Qt.BackgroundRole 而不是 Qt.BackgroundColorRole。
    【解决方案2】:

    我认为您不需要覆盖任何内容。看看 QWidget 的palette 属性。

    【讨论】:

      【解决方案3】:

      我同意“Harald Scheirich”样式表是要走的路。但也许为了说服你,我会告诉你关于样式表中一个鲜为人知的部分,称为属性选择器

      如果您查看样式表文档here,您会看到关于它们的一小部分。基本上我们所做的是为那些具有特定属性集的小部件指定样式表。例如,所有扁平的 QPushButton。

      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 重新评估小部件的样式。否则你可能看不到变化。

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

      【讨论】:

      • 谢谢,我不知道样式表的那个特性。不幸的是,它仍然对我没有帮助,因为 QHeaderView 只包含一个用于设置背景颜色的样式表属性,并且它适用于所有 Header 部分。我需要能够分别更改每个部分的背景颜色。或许有什么方法可以在 Section 子元素上设置属性?
      猜你喜欢
      • 2012-12-24
      • 2010-09-24
      • 2013-11-16
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2016-04-08
      相关资源
      最近更新 更多