Динамическое добавление страниц в QStackedWidget с помощью пользовательского виджета, разработанного в Qt Creator

Итак, я потерян... снова. У меня есть QMainWindow с пустым QStackedWidget. Я хотел бы динамически заполнять QStackedWidget, используя пользовательский виджет, который я создал в Qt Creator. Я попытался создать собственный виджет в PyQT5 в другом потоке, но в данном случае это не касается импорта из файла пользовательского интерфейса. Я продолжаю получать:

AttributeError: у объекта 'QStackedWidget' нет атрибута 'addItemWidget'

Вот код для виджета...

# ItemWidget.py

from PyQt5 import uic
from PyQt5.QtWidgets import QWidget


class Widget:

    def __init__(self):
        self.text = None
        self.data = None


class ItemWidget(QWidget):

    def __init_(self, parent = None):
        self.WidgetList = []
        QWidget.__init__(self, parent = parent)
        uic.loadUi(r'interface/ItemWidget.ui', self)

    def addItemWidget(self, index, text):
        widget = Widget()
        widget.text = text
        self.WidgetList.append([])
        self.WidgetList[index].append(widget)

        # TESTING
        print(self.WidgetList)

Соответствующий код из main.py:

from ItemWidget import *

for key, value in self.ItemIndexList.items():
    self.ItemStackedWidget.addItemWidget(value, key)

Я понимаю, что получаю эту ошибку, потому что QStackedWidget не имеет определенного атрибута с именем 'addItemWidget, но я не знаю, что мне нужно сделать, чтобы это работало как задумано. Когда я пытаюсь переопределить метод с помощью "addWidget", я получаю неожиданную ошибку значения.

Есть идеи? Я довольно плохо знаком с Python и все еще учусь, поэтому, если мне не хватает важной информации, пожалуйста, дайте мне знать.

У меня есть несколько разных ревизий моего MainWindow.ui. У одного просто есть QStackedWidget, куда я хочу, чтобы страницы уходили, другой полностью выложен так, как я представляю конечный продукт. Файл ItemWidget.ui просто содержит элементы, которые я хочу добавить на каждую страницу QStackedWidget. Я не продвигал ни одного из них в пользовательский класс, что, я подозреваю, мне понадобится.

Я в настоящее время использую Python 3.6 и PyQt5

** РЕДАКТИРОВАТЬ ДОБАВИТЬ MVCE **

TestApp.py

from PyQt5.QtWidgets import QApplication
import TestMain
import sys


class MCVE(QApplication):

    def __init__(self):
        args = sys.argv
        QApplication.__init__(self, args)
        self.application = TestMain.TestMainWindow()

    def initApp(self):
        self.application.show()


if __name__ == '__main__':
    app = MCVE()
    app.initApp()
    sys.exit(app.exec_())

TestMain.py

from PyQt5.Qt import Qt
from PyQt5.QtWidgets import QMainWindow
from TestItemWidget import *


class TestMainWindow(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self, None, Qt.Window)
        uic.loadUi(r'interface/TestMainWindow.ui', self)

        SlotList = {('Header1', 0),('Header2', 1)}

        for key, value in SlotList:
            self.ItemStackedWidget.addItemWidget(value, key)

TestItemWidget.py

from PyQt5 import uic
from PyQt5.QtWidgets import QWidget


class Widget:

    def __init__(self):
        self.text = None
        self.data = None


class ItemWidget(QWidget):

    def __init_(self, parent = None):
        self.WidgetList = []
        QWidget.__init__(self, parent = parent, flags = None)
        uic.loadUi(r'interface/TestItemWidget.ui', self)

    def addItemWidget(self, index, text):
        widget = Widget()
        widget.text = text
        self.WidgetList.append([])
        self.WidgetList[index].append(widget)
        print(self.WidgetList)

if __name__ == '__main__':
    pass

TestItemWidget.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item alignment="Qt::AlignHCenter">
    <widget class="QLabel" name="label">
     <property name="text">
      <string>ItemWidget</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

TestMainWindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>417</width>
    <height>288</height>
   </rect>
  </property>
  <property name="MainWindowUI" stdset="0">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="widget">
   <layout class="QVBoxLayout">
    <item>
     <widget class="QStackedWidget" name="ItemStackedWidget"/>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

1 ответ

Решение

Если вы хотите взаимодействовать с виджетом, вы должны сделать это там, где виджет существует, и в вашем случае QStackedWidget существует в TestMain.py, поэтому вы должны использовать его с вашим методом addWidget, у него нет метода addItemWidget, я также рекомендую проверить ваш синтаксис Например, метод init помещается с двумя подчеркиваниями с каждой стороны, но в вашем коде ItemWidget имеет только один справа: __init_В заключение ваш код должен выглядеть следующим образом: добавьте текст к меткам, чтобы он был виден:

TestMain.py

from PyQt5.Qt import Qt
from PyQt5.QtWidgets import QMainWindow, QMenu, QToolBar, QTreeWidgetItem
from TestItemWidget import *

class TestMainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self, None, Qt.Window)
        uic.loadUi(r'interface/TestMainWindow.ui', self)

        SlotList = {('Header1', 0),('Header2', 1)}

        for key, value in SlotList:
            w = ItemWidget(self)
            w.label.setText(key)
            self.ItemStackedWidget.insertWidget(value, w)

TestItemWidget.py

from PyQt5 import uic
from PyQt5.QtWidgets import QWidget

class ItemWidget(QWidget):
    def __init__(self, parent = None):
        QWidget.__init__(self, parent = parent)
        uic.loadUi(r'interface/TestItemWidget.ui', self)
Другие вопросы по тегам