首页 > 解决方案 > PySide2 如何取消分配当前布局并将新布局分配给窗口小部件?.count() 给出属性错误?

问题描述

我是 PySide2 的新手,昨天开始使用它。我正在根据我在网上找到的 API 文档和信息自学。我正在尝试用它制作一个小应用程序来自学。我对应用程序的想法是使用类似视图的模型,当您按下某些按钮时,我会删除窗口上的当前布局并为您呈现一个全新的布局。这促进了模块化,因为每个布局不会相互依赖,而是完全独立的。(应用程序的每个部分都大不相同,需要删除几乎所有小部件)。

但是,每当我搜索如何删除布局或删除其所有小部件时,我总是会遇到这样的一段代码(这实际上来自 6 个月前提出的问题):

def clearLayout(self, layout):
    if layout is not None:
        while layout.count():
            item = layout.takeAt(0)
            widget = item.widget()
            if widget is not None:
                widget.deleteLater()
            else:
                self.clearLayout(item.layout())

然而,当我实现类似的东西时,即使是完全相同的函数,然后使用它调用它,self.clearLayout(self.layout)我也会收到以下错误:

 File "GUI.py", line 45, in home
    self.clearLayout(self.layout)
  File "GUI.py", line 16, in clearLayout
    while layout.count():
AttributeError: 'builtin_function_or_method' object has no attribute 'count'

我假设我可能忘记导入一些重要的东西,但我似乎无法找到什么。这是我的进口清单。

import sys
from PySide2.QtWidgets import QApplication, QLabel, QLineEdit, QWidget
from PySide2.QtWidgets import QDialog, QPushButton, QVBoxLayout, QLayout

pip install PySide2我还使用命令行(Anaconda)安装了 PySide2 。我必须做其他事情吗?

非常感谢,抱歉帖子这么长,只是想从一开始就给你完整的信息:)

编辑:进一步的测试让我意识到我不能使用 QLayout 的任何虚函数或其子类。显然我必须在代码中自己实现它们。我相信它可能是这样的。我不知道如何实现它们。我会继续努力。

编辑 2:有些人要求提供一个可重现的示例,所以这里的代码不起作用。

import sys
from PySide2.QtWidgets import QApplication, QLabel, QLineEdit, QWidget
from PySide2.QtWidgets import QDialog, QPushButton, QVBoxLayout, QLayout

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Program")
        self.setGeometry(300, 300, 300, 300)
        self.start()

    def clearLayout(self, layout):
        if layout is not None:
            while layout.count():
                item = layout.takeAt(0)
                widget = item.widget()
                if widget is not None:
                    widget.deleteLater()
                else:
                    self.clearLayout(item.layout())

    def start(self):
        self.startbutton = QPushButton("Start App")

        layout = QVBoxLayout()
        layout.addWidget(self.startbutton)

        self.setLayout(layout)

        self.startbutton.clicked.connect(self.home)

    def home(self):
        self.clearLayout(self.layout)
        self.message=QLabel("Welcome to homepage")
        layout=QVBoxLayout()
        layout.addWidget(self.message)
        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication([])
    window=Window()
    window.show()
    sys.exit(app.exec_())

标签: python-3.xpyside2

解决方案


推荐阅读