无法动态地将小部件添加到 QScrollArea 对象

Posted

技术标签:

【中文标题】无法动态地将小部件添加到 QScrollArea 对象【英文标题】:Fail to add a widget to a QScrollArea object dynamically 【发布时间】:2020-11-23 13:48:49 【问题描述】:

当我想动态地将小部件添加到QScrollArea 对象时,我遇到了两个问题。当我评论该行时,我想添加的新小部件无法显示在屏幕上。此外,我发现我无法滚动屏幕上的那个区域。

非常感谢您的帮助!

from PyQt5.QtWidgets import *


class MyList(QScrollArea):
    def __init__(self):
        super().__init__()
        self._widget = QWidget()
        self._layout = QVBoxLayout()
        
        # If I comment this line, MyButton._add function will not work, and the screen will not display new widget.
        self._layout.addWidget(QPushButton('test'))

        # set layout and widget
        self._widget.setLayout(self._layout)
        self.setWidget(self._widget)

        # display settings
        self.setMinimumSize(1024, 540)


class MyButton(QPushButton):
    def __init__(self, text, _list):
        super().__init__(text=text)
        self._list = _list
        self.clicked.connect(self._add)
    

    def _add(self):
        self._list._layout.addWidget(QPushButton('test'))


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self._layout = QVBoxLayout()
        self._my_list = MyList()
        self._my_button = MyButton(text='Add', _list=self._my_list)
        self._layout.addWidget(self._my_list)
        self._layout.addWidget(self._my_button)

        # set layout
        self.setLayout(self._layout)

        # display settings
        self.setWindowTitle('My Demo')


def main():
    app = QApplication([])
    main_window = MainWindow()

    main_window.show()
    app.exec_()


if __name__ == "__main__":
    main()    

【问题讨论】:

什么是MyWidget,它的代码在哪里?什么“无法在屏幕上显示”,小部件或滚动区域? “有一个错误”是什么意思? _list 参数是什么?请更准确一点,让自己清楚,并记住,如果你想展示一个例子,你必须确保它都是minimal and reproducible。 你是对的。非常感谢您的建议。我已经修改了我的问题,使其更加最小化和可重复。很抱歉我的正式描述给您带来不便,您能帮我弄清楚吗?@musicamante 【参考方案1】:

您需要滚动区域能够针对动态添加的小部件进行自我调整

class MyList(QScrollArea):
    def __init__(self):
        super().__init__()
        self._widget = QWidget()
        self._layout = QVBoxLayout()
    
        # If I comment this line, MyButton._add function will not work, and the screen will not display new widget.
        self._layout.addWidget(QPushButton('test'))

        # set layout and widget
        self._widget.setLayout(self._layout)
        self.setWidget(self._widget)

        # display settings
        # self.setMinimumSize(1024, 540) remove this to get more dynamic behavior
        # add this line
        self.setWidgetResizable(True)

【讨论】:

以上是关于无法动态地将小部件添加到 QScrollArea 对象的主要内容,如果未能解决你的问题,请参考以下文章

将小部件放在 QScrollArea 的中心

如何有条件地将小部件添加到列表中?

如何将小部件动态添加到网格?

将小部件添加到地图会破坏 GWT 中的其他小部件

在 PyQt5/Pyside2 中动态添加小部件到流布局

Flutter - 在无状态小部件中动态地将项目添加到 ListView