Python 如何将多个组合框作为子项添加到QTreeWidgetItem

Python 如何将多个组合框作为子项添加到QTreeWidgetItem,python,python-2.7,pyside2,qcombobox,qtreewidget,Python,Python 2.7,Pyside2,Qcombobox,Qtreewidget,我的情况是,我需要根据随机不同数量的父母和随机数量的嵌套子代动态生成UI 展开子QTreeWidgetItem时,其子项应如下所示: -Parent -Child -ComboBox | ComboBox | ComboBox | ComboBox 我一直在尝试,没有运气,只是崩溃了。下面是我正在尝试做的一个简单的例子 #/usr/bin/env python 从PySide2导入QtWidgets、QtCore 类TestUI(QtWidgets.QMainWindo

我的情况是,我需要根据随机不同数量的父母和随机数量的嵌套子代动态生成UI

展开子QTreeWidgetItem时,其子项应如下所示:

-Parent
    -Child
        -ComboBox | ComboBox | ComboBox | ComboBox
我一直在尝试,没有运气,只是崩溃了。下面是我正在尝试做的一个简单的例子

#/usr/bin/env python
从PySide2导入QtWidgets、QtCore
类TestUI(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super(TestUI,self)。\uuuuu init\uuuuuu(父级)
def设置界面(自身):
#设置主窗口
self.MainWindow=QtWidgets.QMainWindow(self.parent)
self.MainWindow.resize(900400)
self.MainWindow.setMinimumSize(QtCore.QSize(900600))
self.MainWindow.setObjectName(“TestUI”)
#创建主目录树
self.tree\u widget=QtWidgets.QTreeWidget(self.MainWindow)
self.gridLayout=qtwidts.QGridLayout(self.tree_小部件)
self.MainWindow.setCentralWidget(self.tree\u小部件)
#创建根父项,根据需要对多个父项重复此操作
top\u item=QtWidgets.QTreeWidgetItem(self.tree\u小部件)
top\u item.setText(0,“top\u父项”)
self.tree\u widget.addTopLevelItem(top\u项)
#创建子项
子项=QtWidgets.QTreeWidgetItem(顶项)
child\u item.setText(0,“child\u item”)
顶项。添加子项(子项)
#创建用于用combobox小部件替换项的子项的子项
嵌套的子项=QtWidgets.QTreeWidgetItem(子项)
嵌套的子项。setText(0,“嵌套的子项”)
子项。添加子项(嵌套子项)
#为所有组合框创建组合框小部件
widget=qtwidts.QWidget()
layout=qtwidts.QVBoxLayout(小部件)
#对4个组合框重复此操作4次
combo_box_1=qtwidts.QComboBox()
值=[“1”、“2”、“3”、“4”、“5”]
组合框1.附加项(值)
layout.addWidget(组合框1)
#应用布局中的所有内容
widget.setLayout(布局)
#这一行使我的代码崩溃,但我不知道如何将小部件添加到项目中。
self.tree\u widget.setItemWidget(嵌套的子项,1,组合框1)
#显示用户界面
self.MainWindow.show()文件
#启动用户界面
test=TestUI()
test.setup_UI()

在回答您的问题之前,应该注意您的代码中存在许多不一致之处:您有一个QMainWindow,它是另一个QMainWindow的子窗口,有些小部件是无用的,等等。我建议您分析好您的代码,如果它有意义与否

另一方面,默认的QTreeWidget有一个列,因此您只能设置一个QComboBox,列的索引从0开始。如果希望显示更多列,则必须显式设置

#/usr/bin/env python
从PySide2导入QtWidgets、QtCore
类TestUI(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super(TestUI,self)。\uuuuu init\uuuuuu(父级)
def设置界面(自身):
#创建主目录树
self.tree_widget=QtWidgets.QTreeWidget()
self.setCentralWidget(self.tree\u小部件)
self.tree\u widget.setColumnCount(4)
top\u item=QtWidgets.QTreeWidgetItem(self.tree\u小部件)
top\u item.setText(0,“top\u父项”)
self.tree\u widget.addTopLevelItem(top\u项)
子项=QtWidgets.QTreeWidgetItem(顶项)
child\u item.setText(0,“child\u item”)
顶项。添加子项(子项)
嵌套的子项=QtWidgets.QTreeWidgetItem(子项)
嵌套的子项。setText(0,“嵌套的子项”)
子项。添加子项(嵌套子项)
对于范围内的i(self.tree\u widget.columnCount()):
combo\u box=qtwidts.QComboBox(self.tree\u小部件)
值=[“1”、“2”、“3”、“4”、“5”]
组合框。添加项(值)
self.tree\u widget.setItemWidget(嵌套的子项、i、组合框)
self.tree\u widget.expandAll()文件
自我调整大小(640480)
self.show()
如果名称=“\uuuuu main\uuuuuuuu”:
app=QtWidgets.QApplication([])
test=TestUI()
test.setup_UI()
app.exec()

更新:

另一种可能的解决方案是使用委托自动提供QComboBox:

#/usr/bin/env python
从PySide2导入QtWidgets、QtCore
类StyledItemDelegate(QtWidgets.QStyledItemDelegate):
def油漆(自身、油漆工、选项、索引):
如果index.parent().parent().isValid():
如果isinstance(option.widget、qtwidts.QAbstractItemView):
option.widget.openPersistentEditor(索引)
其他:
super(StyledItemDelegate,self).paint(画师、选项、索引)
def createEditor(自身、父项、选项、索引):
如果index.parent().parent().isValid():
编辑器=QtWidgets.QComboBox(父级)
值=[“1”、“2”、“3”、“4”、“5”]
编辑器.附加项(值)
返回编辑器
返回super(StyledItemDelegate,self).createEditor(父级,选项,索引)
def updateEditorGeometry(自身、编辑器、选项、索引):
setContentsMargins(0,0,0,0)
编辑器.setGeometry(option.rect)
def sizeHint(自身、选项、索引):
s=super(StyledItemDelegate,self).sizeHint(选项,索引)
s、 设置高度(s.高度()*1.5)
返回s
类TestUI(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super(TestUI,self)。\uuuuu init\uuuuuu(父级)
def设置界面(自身):
#创建主目录树
self.tree_widget=QtWidgets.QTreeWidget()
self.setCentralWidget(self.tree\u小部件)
委托=StyledItemDelegate(自)
self.tree_widget.setItemDelegate(委托)
self.tree\u widget.setColumnCount(4)
top\u item=QtWidgets.QTreeWidgetItem(self.tree\u小部件)
到