Ich implementiere eine Python-Anwendung mit PyQt5 und ich stieß auf einige Probleme bei der Verwendung einer QScrollArea. Dies ist das Layout meiner Anwendung:Qt.ScrollBarAsNeeded Scrollbar nicht anzeigen, wenn es tatsächlich benötigt wird
aus 2 QScrollArea
zusammengesetzt ist (linke und rechte Fensterbereich) und einem QMdiArea
(Mitte widget) angeordnet in einem QHBoxLayout
. Wenn ich die Widgets auf der linken Seite durch Klicken auf die Steuerelemente erweitern, und die Höhe der QWidget
der QScrollArea
ist größer als dann die Höhe der QScrollArea
selbst, wird die Bildlaufleiste angezeigt (wie erwartet), aber es überlappt den Inhalt der QScrollArea
. Um dieses Problem zu beheben ich das resizeEvent
Hinzufügen der notwendigen Raum für die Scrollbar neu implementiert (bis zu diesem Punkt alles funktioniert.
Nun, wenn ich das Hauptfenster manuell Größe ändern, wird dem linken Bereich mehr Platz und die Scrollbar verschwinden sollten (aber es funktioniert nicht) und es überlappt die Widgets der Scheibe:
ich habe auch versucht, die Sichtbarkeit der Scrollbar manuell zu wechseln (wenn das resizeEvent empfangen wird): wenn ich dies tun Kann ich mich erfolgreich verstecken Die Bildlaufleiste kann ich dann aber nicht nochmal anzeigen (egal ob ich setVisible(True)
auf der Bildlaufleiste anrufe). Daraus ergibt sich der Raum für die Scrollbar hinzugefügt wird, aber die Scrollbar fehlt und der Inhalt der Scheibe ist nicht scrollbaren:
Hier ist die Implementierung der Scheibe Widget ist:
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)
Was ich ist ziemlich einfach erreichen wollen (aber praktisch scheint es nicht so einfach): ich möchte dynamisch die vertikale Bildlaufleiste am linken/rechten Bereich Widgets zeigen nur dann, wenn sie gebraucht wird, und fügen sie den erforderlichen Platz für die Scrollbar, so dass es überlappt nicht die Widgets in QScrollArea
.
Bevor jemand fragt, ich schon versucht, so etwas zu tun:
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()
, die in meiner Anwendung führt zum Absturz bringen. Ich hoffe, dass jemand dieses Problem bereits erkannt hat und mir helfen kann.
EDIT: Ich verwende PyQt5.5 kompiliert gegen Qt5.5 unter OSX Yosemite 10.10.4 mit Clang. für mich
zuerst versuchen, für Ihre scrollArea 'setWidgetResizable' auf true zu setzen –
ist es bereits festgelegt zu True, also denke ich, das Problem ist woanders –