我有一个带有按钮和
QScrollArea
小部件的窗口。当按下按钮时,应该将 QLabel
添加到 QScrollArea
小部件中。然而,它没有出现。
我知道有很多关于类似问题的问题。大多数人建议使用
setWidgetResizable(True)
,这确实使小部件显示出来,但也会更改其大小:(docs)
如果此属性设置为 true,滚动区域将自动调整小部件的大小,以避免出现滚动条,或者利用额外的空间。
这是 MWE:
from PySide6.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
button = QPushButton('Add')
button.clicked.connect(self.add)
centralWidget = QWidget()
centralWidget.setLayout(QVBoxLayout())
self.setCentralWidget(centralWidget)
centralWidget.layout().addWidget(button)
self.outputLayout = QVBoxLayout()
outputWidget = QWidget()
outputWidget.setLayout(self.outputLayout)
self.scrollArea = QScrollArea()
self.scrollArea.setWidget(outputWidget)
centralWidget.layout().addWidget(self.scrollArea)
def add(self):
label = QLabel('test')
self.outputLayout.addWidget(label)
if __name__ == '__main__':
app = QApplication()
mainWindow = MainWindow()
mainWindow.show()
app.exec()
我尝试将
label.show()
、self.layout.update()
和 self.scrollArea.update()
添加到 MainWindow.add
,但无济于事。如何在不使用 label
的情况下显示 setWidgetResizable
?
经过多次尝试和错误,我找到了一种可以使其发挥作用的方法组合:
def add(self):
label = QLabel('test')
self.outputLayout.addWidget(label)
label.show()
self.scrollArea.widget().adjustSize()
self.scrollArea.widget().updateGeometry()
请注意,小部件需要所有另外三行代码才能显示并正确调整大小:
show
、adjustSize
和 updateGeometry
。另外,顺序很重要。