Я реализую приложение python с помощью PyQt5, и я столкнулся с некоторыми проблемами при использовании QScrollArea. Это расположение моего приложения:Qt.ScrollBarAsNeeded не показывает полосу прокрутки, когда это действительно необходимо
Он состоит из 2 QScrollArea
(левая и правая панель) и QMdiArea
(центр виджета), расположенный в QHBoxLayout
. Когда я расширяю виджеты на левой панели, нажимая на элементы управления, а высота QWidget
из QScrollArea
больше, чем высота самого QScrollArea
, полоса прокрутки появляется (как и ожидалось), но она перекрывает содержимое QScrollArea
, Чтобы устранить эту проблему, я Переопределённая в resizeEvent
добавив необходимое пространство для скроллинга (до этого момента все работает.
Теперь, когда я вручную изменить размер главного окна, левая панель получает больше пространства и скроллбара должны исчезнуть (но это не делает), и он перекрывает виджеты панели:
Я также попытался вручную переключать видимость полосы прокрутки (когда resizeEvent принимается): когда я делаю это , Я могу скрыть t он полоса прокрутки, но потом я не могу показать ее снова (неважно, вызываю ли я 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()
что приводит в моем приложении к сбою. Надеюсь, что кто-то уже столкнулся с этой проблемой и может мне помочь.
EDIT: Я использую PyQt5.5, составленный против Qt5.5 под OSX Yosemite 10.10.4, используя clang.
попробуйте сначала установить 'setWidgetResizable' к истинному для ScrollArea –
это уже установлено Истинно, так что я думаю, проблема в другом месте –