При общей модели QAbstractListModel в виджете child_list_view не отображаются вложенные элементы, родитель которых выбран в parent_list_view
Помогите пожалуйста. Есть два списка QListView которые используют одну и ту же модель, основанную на QAbstractListModel. Данные представляют собой список со вложенными элементами. В первом списке отображаются только родительские элементы списка. Нужно чтобы при выборе родительского элемента в первом списке во втором списке отображались вложенные элементы для выбранного в первом списке родительского. Есть такой код, но данные во втором списке не отображаются.
from PySide6.QtCore import Qt, QAbstractListModel, QModelIndex
from PySide6.QtWidgets import QApplication, QListView, QVBoxLayout, QWidget
import sys
class NestedListModel(QAbstractListModel):
def __init__(self, _data, parent=None):
super(NestedListModel, self).__init__(parent)
self.list_data = _data
def rowCount(self, parent=QModelIndex()):
if parent.isValid():
parent_item = parent.internalPointer()
return len(parent_item['children'])
else:
return len(self.list_data)
def columnCount(self, parent=None):
return 1
def data(self, index, role=Qt.DisplayRole):
if not index.isValid():
return None
if role == Qt.DisplayRole:
if index.parent().isValid():
parent_item = index.parent().internalPointer()
return parent_item['children'][index.row()]['name']
else:
return self.list_data[index.row()]['name']
def index(self, row=int, column=0, parent=QModelIndex()):
if not self.hasIndex(row, column, parent):
return QModelIndex()
if parent.isValid():
parent_item = parent.internalPointer()
child_item = parent_item['children'][row]
return self.createIndex(row, column, child_item)
else:
parent_item = self.list_data[row]
return self.createIndex(row, column, parent_item)
def flags(self, index):
if not index.isValid():
return Qt.NoItemFlags
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
if __name__ == "__main__":
app = QApplication(sys.argv)
# Создаем данные для модели
data = [
{'name': 'Parent 1', 'children': [{'name': 'Child 1'}, {'name': 'Child 2'}]},
{'name': 'Parent 2', 'children': [{'name': 'Child 3'}, {'name': 'Child 4'}]},
{'name': 'Parent 3', 'children': [{'name': 'Child 5'}, {'name': 'Child 6'}]},
{'name': 'Parent 4', 'children': [{'name': 'Child 7'}, {'name': 'Child 8'}]},
]
model = NestedListModel(data)
# Создаем первый QListView для отображения родительских элементов
parent_list_view = QListView()
parent_list_view.setModel(model)
parent_list_view.setCurrentIndex(model.index(0, 0))
# Создаем второй QListView для отображения вложенных элементов
child_list_view = QListView()
child_list_view.setModel(model)
child_list_view.setRootIndex(model.index(0, 0))
# Обновляем второй QListView при выборе родительского элемента в первом QListView
def updateChildListView(index):
child_list_view.setRootIndex(index)
parent_list_view.clicked.connect(updateChildListView)
# parent_list_view.clicked.connect(child_list_view.setRootIndex)
layout = QVBoxLayout()
layout.addWidget(parent_list_view)
layout.addWidget(child_list_view)
widget = QWidget()
widget.setLayout(layout)
widget.show()
sys.exit(app.exec())