PyQt5:QScrollBar可见性发生变化时有信号吗?

问题描述 投票:0回答:1

我在Maya中使用pyside2(与PyQt5基本相同)。

我有一个带有滚动区域的gui ...滚动区域中有几行按钮和一些东西,如果用户拖动窗口并将其扩大到更大,我想水平扩展这些东西。可以向其中添加这些项目的额外行,以使垂直滚动条(显然)出现。

我正在尝试确定一种方法,以防止滚动条出现/消失时,我的项目行略微改变大小。视觉上,如果要添加新行并且出现滚动条,或者如果用户将窗口扩大一些并且滚动条消失,则我希望每一行中项目的宽度都说相同。]

如果滚动条的可见性发生变化,是否有信号或某物被发送,以便我可以调整滚动区域中项目的布局边距?

我知道我可以将滚动条设置为可见或不可见,但是当gui的大小或滚动区域中的内容被修改时,这种变化固有地改变时,我找不到可以挂接到的东西...如果还没有信号,我该如何创建一个信号?

python pyqt5 maya pyside2 qscrollbar
1个回答
0
投票

好吧,在搜寻有关aaron评论的hideEvent之后,我发现了一些似乎可行的方法...

我为滚动区域中的垂直滚动条创建了一个事件过滤器...因此,在我的代码中定义了滚动区域的部分中,我有类似以下内容:

scroll_area_widget = QtWidgets.QWidget()
self.scroll_area_layout = QtWidgets.QVBoxLayout()
scroll_area_widget.setLayout(self.scroll_area_layout)

scroll_area = QtWidgets.QScrollArea()
scroll_area.setWidget(scroll_area_widget)

self.scrollbar = scroll_area.verticalScrollBar()
self.scrollbar.installEventFilter(self)

然后,我定义一个'eventFilter'方法,如下所示:

def eventFilter(self, o, e):
    if o is self.scrollbar:
        if e.type() == QtCore.QEvent.Show:
            self.scroll_area_layout.setContentsMargins(5, 0, 3, 0)
        elif e.type() == QtCore.QEvent.Hide:
            self.scroll_area_layout.setContentsMargins(5, 0, 15, 0)
            QtWidgets.QApplication.processEvents()
    return False

我在其中放置了'processEvents',因为当滚动条消失时我会忽隐忽现,因为我认为布局中的小部件在内容页边距得到更新之前会伸展以填充空间...这无助于防止每次都在闪烁,但似乎比我没有的时候要少...

现在的问题是如何避免闪烁?当然,另一个问题是,由于我对事件过滤器的了解不多,这是否是解决此特定问题的好方法...仅在显示/隐藏滚动条时才会触发该事件,还是它适用于gui中显示/隐藏的任何内容?我问这是因为'eventFilter'方法似乎并不特定于滚动条。

© www.soinside.com 2019 - 2024. All rights reserved.