首页 文章

使用Qt Creator中设计的自定义小部件动态地将页面添加到QStackedWidget

提问于
浏览
0

所以我又迷失了......我有一个带有空QStackedWidget的QMainWindow . 我想使用我在Qt Creator中创建的自定义小部件动态填充QStackedWidget . 我尝试在另一个线程中关注Creating a custom widget in PyQT5,但这并不包括在这种情况下从UI文件导入 . 我一直收到:

AttributeError:'QStackedWidget'对象没有属性'addItemWidget'

这是Widget的代码......

# 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 回答

  • 1

    如果你想与一个小部件进行交互,你必须在小部件存在的地方进行交互,在你的情况下,QStackedWidget存在于TestMain.py中,所以你必须将它与你的addWidget方法一起使用,它没有addItemWidget方法,我还建议验证你的语法例如,init方法每侧放置2个下划线,但在你的代码中,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)
    

相关问题