为什么我的QSplitter的QSplitterHandles拒绝格式化?

时间:2020-11-04 04:48:37

标签: python pyqt qsplitter

我有一个简单的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句柄本身绝对拒绝对它们进行任何可视化修改。{p>

我尝试过样式表:

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)

绝对没有任何事情可以改变这些句柄的显示方式。我唯一可以更改的“视觉”内容就是宽度,即通过QSplitter.setHandleWidth()

请有人指出我在这里想念的痛苦,愚蠢的显而易见的事情,以便我继续生活。

1 个答案:

答案 0 :(得分:1)

前提

QSplitterHandle是少数非常特定的小部件之一,这些小部件不似乎遵循通用的QWidget“规则”;原因很简单:它的目标通常限于其预期用途,即QSplitter child
然后,您必须考虑,尽管样式表语法相当“自由”,但它遵循基本但重要的规则,但它依赖于所使用的基础QStyle,并且每当子窗口小部件非常依赖其父窗口时,其行为就可能发生变化,例如情况。


首先,您的方法存在一个概念上的问题:样式表语法错误,因为您尝试使用类似选择器的语法(使用{大括号),而未指定选择器。使用这样的语法,即使使用更多的“标准”小部件,样式表也不会应用。

但这还不够。 QSplitter handle()文档解释了一个重点(强调我的意思):

在给定的 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)一样,您需要为子控件使用特定的selectors,如QSplitter stylesheet documentation中所述;使用选择器,无论使用哪种样式,您都可以确保将颜色规则整体应用于手柄:

self.splitter.setStyleSheet("QSplitter::handle {background-color: red}")
相关问题