使用 Qt Creator 中设计的自定义小部件将页面动态添加到 QStackedWidget
Dynamically adding pages to QStackedWidget using a custom widget designed in Qt Creator
所以我又迷路了……。我有一个带有空 QStackedWidget 的 QMainWindow。我想使用我在 Qt Creator 中创建的自定义小部件动态填充 QStackedWidget。我尝试在另一个线程中关注 ,但在这种情况下,这并不真正涵盖从 UI 文件导入。我不断收到:
AttributeError: 'QStackedWidget' object has no attribute '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 页面的元素。我没有将它们中的任何一个提升为自定义 class,我想我需要这样做。
我目前正在使用 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>
如果你想与小部件交互,你必须在小部件存在的地方进行,在你的情况下 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)
所以我又迷路了……。我有一个带有空 QStackedWidget 的 QMainWindow。我想使用我在 Qt Creator 中创建的自定义小部件动态填充 QStackedWidget。我尝试在另一个线程中关注
AttributeError: 'QStackedWidget' object has no attribute '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 页面的元素。我没有将它们中的任何一个提升为自定义 class,我想我需要这样做。
我目前正在使用 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>
如果你想与小部件交互,你必须在小部件存在的地方进行,在你的情况下 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)