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

2024-09-30 05:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的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()

有人请指出我在这里错过的痛苦、愚蠢、明显的东西,这样我才能继续我的生活


Tags: selfactions部件视觉widgetqt句柄handle
1条回答
网友
1楼 · 发布于 2024-09-30 05:22:27

前提

qspliterHandle是少数几个非常特定的小部件之一,这些小部件看起来不像遵循一般的QWidget“规则”;原因很简单:它的目标通常仅限于其预期用途,即qspliterchild
然后,你必须考虑到,虽然漂亮的“自由”,样式表语法遵循基本但重要的规则,它取决于所使用的底层QSLUTE,当子控件非常依赖于它的父时,它的行为可能会发生变化。p>


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

但这还不够。QSplitter ^{}文档解释了一个要点(重点是我的):

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;}")

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

与其他复杂的小部件(如QComboBox或qabstractemview)一样,您需要为子控件使用特定的selectors,如QSplitter stylesheet documentation中明确说明的那样;使用选择器可以确保颜色规则作为一个整体应用于控制柄,而不管使用的样式是什么:

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

相关问题 更多 >

    热门问题