Прежде чем ответить на ваш вопрос, следует отметить, что в вашем коде много несоответствий: у вас есть QMainWindow, являющееся дочерним по отношению к другому QMainWindow, есть виджеты, которые бесполезны и т. Д. c. Я рекомендую вам хорошо проанализировать ваш код, если он имеет смысл или нет.
С другой стороны, QTreeWidget по умолчанию имеет столбец, поэтому вы можете установить только QComboBox, а индексы столбцов начинаются с 0. Если вы чтобы появилось больше столбцов, вы должны установить их явно.
#! /usr/bin/env python
from PySide2 import QtWidgets, QtCore
class TestUI(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(TestUI, self).__init__(parent)
def setup_UI(self):
# Create the main tree
self.tree_widget = QtWidgets.QTreeWidget()
self.setCentralWidget(self.tree_widget)
self.tree_widget.setColumnCount(4)
top_item = QtWidgets.QTreeWidgetItem(self.tree_widget)
top_item.setText(0, "Top_Parent_Item")
self.tree_widget.addTopLevelItem(top_item)
child_item = QtWidgets.QTreeWidgetItem(top_item)
child_item.setText(0, "Child_Item")
top_item.addChild(child_item)
nested_child_item = QtWidgets.QTreeWidgetItem(child_item)
nested_child_item.setText(0, "Nested_Child_Item")
child_item.addChild(nested_child_item)
for i in range(self.tree_widget.columnCount()):
combo_box = QtWidgets.QComboBox(self.tree_widget)
values = ["1", "2", "3", "4", "5"]
combo_box.addItems(values)
self.tree_widget.setItemWidget(nested_child_item, i, combo_box)
self.tree_widget.expandAll()
self.resize(640, 480)
self.show()
if __name__ == "__main__":
app = QtWidgets.QApplication([])
test = TestUI()
test.setup_UI()
app.exec_()
Обновление:
Другой Возможное решение - использовать делегата для автоматического предоставления QComboBox:
#! /usr/bin/env python
from PySide2 import QtWidgets, QtCore
class StyledItemDelegate(QtWidgets.QStyledItemDelegate):
def paint(self, painter, option, index):
if index.parent().parent().isValid():
if isinstance(option.widget, QtWidgets.QAbstractItemView):
option.widget.openPersistentEditor(index)
else:
super(StyledItemDelegate, self).paint(painter, option, index)
def createEditor(self, parent, option, index):
if index.parent().parent().isValid():
editor = QtWidgets.QComboBox(parent)
values = ["1", "2", "3", "4", "5"]
editor.addItems(values)
return editor
return super(StyledItemDelegate, self).createEditor(parent, option, index)
def updateEditorGeometry(self, editor, option, index):
editor.setContentsMargins(0, 0, 0, 0)
editor.setGeometry(option.rect)
def sizeHint(self, option, index):
s = super(StyledItemDelegate, self).sizeHint(option, index)
s.setHeight(s.height() * 1.5)
return s
class TestUI(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(TestUI, self).__init__(parent)
def setup_UI(self):
# Create the main tree
self.tree_widget = QtWidgets.QTreeWidget()
self.setCentralWidget(self.tree_widget)
delegate = StyledItemDelegate(self)
self.tree_widget.setItemDelegate(delegate)
self.tree_widget.setColumnCount(4)
top_item = QtWidgets.QTreeWidgetItem(self.tree_widget)
top_item.setText(0, "Top_Parent_Item")
self.tree_widget.addTopLevelItem(top_item)
child_item = QtWidgets.QTreeWidgetItem(top_item)
child_item.setText(0, "Child_Item")
top_item.addChild(child_item)
nested_child_item = QtWidgets.QTreeWidgetItem(child_item)
child_item.addChild(nested_child_item)
self.tree_widget.expandAll()
self.resize(640, 480)
self.show()
if __name__ == "__main__":
app = QtWidgets.QApplication([])
test = TestUI()
test.setup_UI()
app.exec_()