PySide2 Как отменить назначение текущего макета и назначить новый виджету окна? .count () выдает ошибку атрибута? - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в PySide2, начал использовать его вчера. Я учу себя из документации API и информации, которую я нахожу онлайн. Я пытаюсь сделать небольшое приложение, чтобы научить себя. Моя идея для приложения заключалась в том, чтобы использовать модель, похожую на вид, когда вы нажимаете go на определенных кнопках, я удаляю текущий макет в окне и представляю вам совершенно новый. Это способствует модульности, поскольку каждый макет не будет зависеть друг от друга, а будет полностью индивидуальным. (Каждая часть приложения сильно отличается и требует удаления почти всех виджетов.)

Однако всякий раз, когда я ищу, как удалить макет или удалить все его виджеты, я всегда сталкиваюсь с таким фрагментом кода ( Это на самом деле из вопроса, заданного 6 месяцев go):

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

Я также установил PySide2, используя pip install PySide2 в командной строке (Anaconda). Должен ли я сделать что-то еще?

Большое спасибо, извините, пост так долго, просто хотел дать вам всю информацию с самого начала:)

РЕДАКТИРОВАТЬ: дальнейшее тестирование привело Я понимаю, что не могу использовать ни одну из виртуальных функций 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_())
...