PyQt5 kullanarak bir python uygulaması yapıyorum ve bir QScrollArea kullanırken bazı sorunlarla karşılaştım. Bu 2 QScrollArea
(sol ve sağ bölme) ve bir QMdiArea
(merkez widget'ı) oluşan bir QHBoxLayout
içine temin ettiQt.ScrollBarAsGeri gerekli olduğunda kaydırma çubuğunu göstermediniz
: Bu benim uygulamanın düzenidir. Denetimleri tıklatarak sol bölmedeki widget'ları genişletdiğimde ve QScrollArea
'un QWidget
'un yüksekliği, QScrollArea
'un kendisinden daha büyükse, kaydırma çubuğu (beklendiği gibi) görünür, ancak QScrollArea
içeriğinin üst üste gelmesiyle . Bu nokta her şey çalışıyor dek (Kaydırma için gerekli alanı ekleyerek resizeEvent
reimplemented Bu sorunu gidermek için.
Şimdi, elle Ana Pencere yeniden boyutlandırma sırasında sol Bölmesi daha fazla yer ve kaydırma çubuğunu alır kaybolur (ama öyle değil) ve bölmenin widget örtüşür:
Ben elle de (resizeEvent alındığında) kaydırma görünürlüğünü değiştirmek çalıştı: böyle yaptığımda Başarılı bir şekilde saklayabilirim o kaydırma çubuğu ama sonra tekrar gösteremiyorum (kaydırma çubuğunda setVisible(True)
çağırırsam farketmez). Bu eklenen kaydırma uzayda sonuçlanır ancak kaydırma eksik ve bölmesinde içeriği kaydırılabilir değildir:
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)
:
bölmesi widget uygulamasıdır
Neyi başarmak istediğim oldukça basit (ama pratik olarak basit değil): Ben sadece ihtiyaç duyulduğunda sol/sağ bölme widget'larımdaki dikey kaydırma çubuğunu dinamik olarak göstermek ve kaydırma çubuğu için gerekli alanı eklemek istiyorum. QScrollArea
'daki widget'lar ile çakışmaz. Birisi sorar önce
, ben zaten böyle bir şey yapmaya çalıştık: başvurumun sonuçlanır
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()
çökmesine. Umarım birileri zaten bu konuda yüzleşmiştir ve bana yardım edebilir.
DÜZENLEME: Clang kullanarak OSX Yosemite 10.10.4 altında Qt5.5 karşı derlenmiş PyQt5.5 kullanıyorum.
sizin scrollArea –
için 'Zaten ayarlanmış true setWidgetResizable' basan ilk deneyin: Aşağıda GÜNCELLEME
kaydırma çubukları gösterildiğinde/gizli scrollareas boyutlandırır basit bir örnek Doğru, bu yüzden sorun başka bir yerde –