Qt/PySide6:在运行时将小部件添加到QScrollArea,但不显示

问题描述 投票:0回答:1

我有一个带有按钮和

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

python qt pyside
1个回答
0
投票

经过多次尝试和错误,我找到了一种可以使其发挥作用的方法组合:

    def add(self):
        label = QLabel('test')
        self.outputLayout.addWidget(label)
        label.show()
        self.scrollArea.widget().adjustSize()
        self.scrollArea.widget().updateGeometry()

请注意,小部件需要所有另外三行代码才能显示并正确调整大小:

show
adjustSize
updateGeometry
。另外,顺序很重要。

© www.soinside.com 2019 - 2024. All rights reserved.