【发布时间】:2015-11-25 20:54:37
【问题描述】:
我正在使用 PyQt5 实现一个 python 应用程序,在使用 QScrollArea 时遇到了一些问题。这是我的应用程序的布局:
它由 2 个QScrollArea(左右窗格)和一个QMdiArea(中心小部件)组成,排列成一个QHBoxLayout。当我通过单击控件展开左窗格上的小部件时,QScrollArea 的QWidget 的高度大于QScrollArea 本身的高度,滚动条出现(如预期的那样),但它是与QScrollArea 的内容重叠。为了解决这个问题,我重新实现了resizeEvent,为滚动条添加了必要的空间(此时一切正常。
现在,当我手动调整主窗口的大小时,左侧窗格获得更多空间,滚动条应该消失(但它没有)并且它与窗格的小部件重叠:
我还尝试手动切换滚动条的可见性(当收到 resizeEvent 时):当我这样做时,我可以成功隐藏滚动条但是我不能再次显示它(不管我是否调用 @987654337 @ 在滚动条上)。这会导致添加滚动条的空间,但缺少滚动条并且窗格的内容不可滚动:
下面是窗格小部件的实现:
class Pane(QScrollArea):
MinWidth = 186
def __init__(self, alignment=0, parent=None):
super().__init__(parent)
self.mainWidget = QWidget(self)
self.mainLayout = QVBoxLayout(self.mainWidget)
self.mainLayout.setAlignment(alignment)
self.mainLayout.setContentsMargins(0, 0, 0, 0)
self.mainLayout.setSpacing(0)
self.setContentsMargins(0, 0, 0, 0)
self.setFrameStyle(QFrame.NoFrame)
self.setFixedWidth(Pane.MinWidth)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Ignored)
self.setWidgetResizable(True)
self.setWidget(self.mainWidget)
def resizeEvent(self, resizeEvent):
if self.viewport().height() < self.widget().height():
self.setFixedWidth(Pane.MinWidth + 18)
# THIS DOESN'T WORK
#self.verticalScrollBar().show()
else:
self.setFixedWidth(Pane.MinWidth)
#self.verticalScrollBar().hide()
def addWidget(self, widget):
self.mainLayout.addWidget(widget)
def removeWidget(self, widget):
self.mainLayout.removeWidget(widget)
def update(self, *__args):
for item in itemsInLayout(self.mainLayout):
item.widget().update()
super().update(*__args)
我想要实现的非常简单(但实际上似乎并不那么简单):我想仅在需要时在左/右窗格小部件上动态显示垂直滚动条,并为滚动条添加必要的空间所以它不会与QScrollArea 中的小部件重叠。
在有人问之前,我已经尝试过这样做:
def resizeEvent(self, resizeEvent):
if self.viewport().height() < self.widget().height():
self.setFixedWidth(Pane.MinWidth + 18)
scrollbar = self.verticalScrollbar()
scrollbar.setVisible(True)
self.setVerticalScrollBar(scrollbar) ## APP CRASH
else:
self.setFixedWidth(Pane.MinWidth)
#self.verticalScrollBar().hide()
这会导致我的应用程序崩溃。 我希望有人已经遇到过这个问题并且能够帮助我。
编辑:我在 OSX Yosemite 10.10.4 下使用针对 Qt5.5 编译的 PyQt5.5,使用 clang。
【问题讨论】:
-
首先尝试将您的滚动区域的
setWidgetResizable设置为 true -
它已经设置为 True,所以我猜问题出在其他地方
标签: python qt python-3.x pyqt5 qscrollarea