我正在使用PyQt5实现一个应用程序,在使用QScrollArea时遇到了一些问题。这是我的应用程序布局:
它由两个QScrollArea
(左侧和右侧窗格)和一个QMdiArea
(中心小部件)组成,排列成QHBoxLayout
。当我通过单击控件展开左侧窗格上的小部件,并且QScrollArea
的QWidget
的高度大于QScrollArea
本身的高度时,滚动条会出现(如预期),但它重叠在QScrollArea
的内容上。为了解决这个问题,我重新实现了resizeEvent
,增加了必要的滚动条空间(到此为止一切正常)。
我还尝试手动切换滚动条的可见性(当接收到resizeEvent时):这样做时,我可以成功地隐藏滚动条,但是我无法再次显示它(无论我是否在滚动条上调用setVisible(True)
)。这导致添加了滚动条的空间,但滚动条缺失且面板内容无法滚动:
这里是面板小部件的实现:
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()
这导致我的应用程序崩溃。
我希望已经有人遇到过这个问题并能够帮助我。
编辑:我正在使用针对Qt5.5编译的PyQt5.5,在OSX Yosemite 10.10.4下使用clang。
setWidgetResizable
设置为 true,以适应您的滚动区域。 - Pie_Jesu