0

我有一个简单QSplitter的几个小部件:

...
actions_splitter = QSplitter(
    Qt.Horizontal,
    frameShape=QFrame.StyledPanel,
    frameShadow=QFrame.Plain
)
actions_splitter.addWidget(self.systems)
actions_splitter.addWidget(self.events)
actions_splitter.addWidget(self.compass_widget)
actions_splitter.setChildrenCollapsible(False)
...

生成的拆分器功能非常好,因为我可以将鼠标悬停在它们的位置上,查看光标的变化,然后拖动它们并更改相邻小部件的大小。

问题是手柄本身,QSplitterHandles绝对拒绝对它们进行任何视觉修改。

我试过样式表:

handle = actions_splitter.handle(0)
handle.setStyleSheet("{background-color: red}")

我尝试向它们添加带有小部件的布局:

handle = actions_splitter.handle(0)
layout = QHBoxLayout()
widget = QPushButton("HANDLE")
layout.addWidget(widget)
handle.setLayout(layout)

并且绝对没有做任何事情来改变这些句柄的显示方式。我可以改变的唯一“视觉”的东西是它们的宽度,那就是 via QSplitter.setHandleWidth()

有人请指出我在这里错过的痛苦,愚蠢的显而易见的事情,这样我就可以继续我的生活。

4

1 回答 1

1

前提

QSplitterHandle 是少数几个似乎不遵循通用 QWidget “规则”的非常具体的小部件之一;原因很简单:它的目的通常仅限于它的用途,即作为 QSplitter child。 然后,您必须考虑到,样式表语法虽然非常“自由”,但遵循基本但重要的规则,它取决于使用的底层 QStyle,并且每当子小部件非常依赖其父小部件时,其行为可能会发生变化,如下所示案子。


首先,您的方法存在一个概念性问题:样式表语法错误,因为您尝试使用类似选择器的语法(使用 {braces})而不指定选择器。使用这样的语法,样式表无论如何都不会被应用,即使有更多的“标准”小部件。

但这还不够。QSplitterhandle()文档解释了一个重点(重点是我的):

返回给定index处拆分器布局中项目左侧(或上方)的句柄,或者nullptr如果没有这样的项目。索引 0 处的句柄始终隐藏。

即使您的语法是正确的,因为您尝试将样式表应用于第一个(隐藏的)句柄,它也不会起作用。

因此,理论上,正确的语法应该如下:

self.splitter.handle(1).setStyleSheet("background-color: red;")

更好:

self.splitter.handle(1).setStyleSheet(
    "QSplitterHandle {background-color: red;}")

或者,对于所有句柄:

self.splitter.setStyleSheet(
    "QSplitterHandle {background-color: red;}")

另一方面,由于 QSplitterHandle 是一个非常特殊的小部件,它的颜色属性根据当前应用的 QStyle 以不同的方式应用,即使使用正确的语法也是如此。请记住,样式表是对当前 QStyle 的覆盖,这意味着 QStyles声明了绘制规则,并根据这些规则应用最终的样式表。
例如,“windows”样式使用样式表的背景颜色规则来绘制句柄的实际背景,而fusion样式使用背景颜色仅绘制拆分器的“点”。

与其他复杂的小部件(如 QComboBox 或 QAbstractItemView)一样,您需要为子控件使用特定的选择器,这在QSplitter 样式表文档中有明确说明;使用选择器可以确保将颜色规则作为一个整体应用于手柄,无论使用何种样式:

self.splitter.setStyleSheet("QSplitter::handle {background-color: red}")
于 2020-11-04T08:02:13.053 回答