为什么我的 QSplitter 的 QSplitterHandles 拒绝格式化?
Why are my QSplitter's QSplitterHandles refusing to get formatted?
我有一个简单的 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)
绝对没有任何东西可以改变这些句柄的显示方式。我唯一可以改变的“视觉”是它们的宽度,这是通过 QSplitter.setHandleWidth()
.
请有人指出我在这里遗漏的痛苦、愚蠢的显而易见的事情,这样我才能继续我的生活。
前提
QSplitterHandle 是少数非常 不似乎 遵循通用 QWidget“规则”的特定小部件之一;原因很简单:它的目标通常仅限于它的预期用途,即 QSplitter child.
然后,你必须考虑到,虽然相当“自由”,但样式表语法遵循基本但重要的规则,它取决于正在使用的底层 QStyle,并且当子窗口小部件非常依赖于其父窗口时,它的行为可能会发生变化,如下所示案例.
首先,您的方法存在概念性问题:样式表语法错误,因为您试图在未指定选择器的情况下使用 selector-like 语法(使用 {braces})。使用这样的语法,无论如何都不会应用样式表,即使有更多的“标准”小部件。
但这还不够。 QSplitter handle()
文档解释了一个重点(重点是我的):
Returns the handle to the left of (or above) the item in the splitter's layout at the given index, or nullptr
if there is no such item. The handle at index 0 is always hidden.
即使您的语法正确,它也不会起作用,因为您试图将样式表应用于第一个(隐藏的)句柄。
因此,从理论上讲,正确的语法应该如下所示:
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 以不同的方式应用。请记住,样式表 overrides 当前 QStyle,这意味着 QStyles states 绘画规则,并根据这些规则应用最终样式表。
例如,“windows”样式使用样式表的背景颜色规则绘制手柄的实际背景,而 fusion 样式使用背景颜色绘制手柄仅分离器的“点”。
与其他复杂的小部件(如 QComboBox 或 QAbstractItemView)一样,您需要使用特定的 selectors for sub-controls, as clearly explained in the QSplitter stylesheet documentation;使用选择器确保颜色规则作为一个整体应用于手柄,无论使用何种样式:
self.splitter.setStyleSheet("QSplitter::handle {background-color: red}")
我有一个简单的 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)
绝对没有任何东西可以改变这些句柄的显示方式。我唯一可以改变的“视觉”是它们的宽度,这是通过 QSplitter.setHandleWidth()
.
请有人指出我在这里遗漏的痛苦、愚蠢的显而易见的事情,这样我才能继续我的生活。
前提
QSplitterHandle 是少数非常 不似乎 遵循通用 QWidget“规则”的特定小部件之一;原因很简单:它的目标通常仅限于它的预期用途,即 QSplitter child.
然后,你必须考虑到,虽然相当“自由”,但样式表语法遵循基本但重要的规则,它取决于正在使用的底层 QStyle,并且当子窗口小部件非常依赖于其父窗口时,它的行为可能会发生变化,如下所示案例.
首先,您的方法存在概念性问题:样式表语法错误,因为您试图在未指定选择器的情况下使用 selector-like 语法(使用 {braces})。使用这样的语法,无论如何都不会应用样式表,即使有更多的“标准”小部件。
但这还不够。 QSplitter handle()
文档解释了一个重点(重点是我的):
Returns the handle to the left of (or above) the item in the splitter's layout at the given index, or
nullptr
if there is no such item. The handle at index 0 is always hidden.
即使您的语法正确,它也不会起作用,因为您试图将样式表应用于第一个(隐藏的)句柄。
因此,从理论上讲,正确的语法应该如下所示:
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 以不同的方式应用。请记住,样式表 overrides 当前 QStyle,这意味着 QStyles states 绘画规则,并根据这些规则应用最终样式表。
例如,“windows”样式使用样式表的背景颜色规则绘制手柄的实际背景,而 fusion 样式使用背景颜色绘制手柄仅分离器的“点”。
与其他复杂的小部件(如 QComboBox 或 QAbstractItemView)一样,您需要使用特定的 selectors for sub-controls, as clearly explained in the QSplitter stylesheet documentation;使用选择器确保颜色规则作为一个整体应用于手柄,无论使用何种样式:
self.splitter.setStyleSheet("QSplitter::handle {background-color: red}")