PyQt5:当 QScrollBar 可见性发生变化时是不是有信号?

Posted

技术标签:

【中文标题】PyQt5:当 QScrollBar 可见性发生变化时是不是有信号?【英文标题】:PyQt5: is there a signal when a QScrollBar visibility changes?PyQt5:当 QScrollBar 可见性发生变化时是否有信号? 【发布时间】:2020-05-15 16:47:45 【问题描述】:

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

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

我正在尝试确定一种方法,以防止在滚动条出现/消失时轻微调整项目行的大小。从视觉上看,如果添加了新行并且出现滚动条,或者如果用户将窗口展开一些并且滚动条消失,我希望每行中的项目的宽度相同...

如果滚动条的可见性发生变化,是否会发送信号或其他内容,以便我可以调整滚动区域中项目的布局边距?

我知道我可以将滚动条设置为可见或不可见,但是当它随着 gui 的大小或滚动区域中的内容被修改而固有地发生变化时,我找不到任何可以挂钩的东西。 . 如果还没有信号,我怎么能创建一个?

【问题讨论】:

您是否尝试过覆盖自定义 qscrollbar 类中的隐藏事件处理程序? doc.qt.io/qt-5/qscrollbar.html#hideEvent @Aaron 我还没有......你实际上是怎么做到的(并确保 QScrollArea 使用你重写的 QScrollBar 类)? 【参考方案1】:

好的,在搜索了 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'方法似乎并不特定于滚动条,并且如果整个gui中的每个事件都通过,则放置if语句检查它是否是滚动条似乎有点开销.. ..

【讨论】:

闪烁确实是由于布局的更新而发生的。另一种可能性可能是在调整滚动区域大小时为小部件设置固定宽度,但您原始问题中的minimal, reproducible example 可能会有所帮助。 @musicamante - 是的,我有一种感觉......不幸的是,当用户使窗口变宽时,我确实需要滚动区域内的小部件展开,因此设置一个固定的宽度会阻止... 这正是我所说的:一个固定的宽度每当滚动区域被调整大小。同样,提供一个 MRE,它会让一切变得更简单。

以上是关于PyQt5:当 QScrollBar 可见性发生变化时是不是有信号?的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt5 中获取滚动条拇指的大小/宽度?

使用 pyqt5 和 matplotlib 进行图形滚动

事务性发件箱模式:解决数据库事务和消息的一致性

事务性发件箱模式:解决数据库事务和消息的一致性

事务性发件箱模式:解决数据库事务和消息的一致性

qscrollbar获取内容大小