Как синхронизируются QtreeView и TreeModel

Я использую pyqt5 и python 3.6. Я смущен индексными функциями в QModel / TreeView и прошу здесь очистить мой узел в мозгу. Некоторые темы запутали меня больше, потому что они очень особенные. У меня вопрос более-менее базовый.

У меня есть модель (на основе отличных руководств Улудага) с данными и я установил это к моему дереву:

treeView = QTreeView()
treeView.show()
treeView.setModel(model)
#additional code
treeView.clicked.connect(treeViewStructure_clicked)

Теперь мне нужно подготовить дальнейшие действия в программе на основе выбранного пункта. Я могу получить товар

def treeViewStructure_clicked(self):
    #get the row of the click and print
    index = treeView.currentIndex()
    print(index.row())
    print('selected item index at %s with data: %s' % (index.row(), index.data()))

Все идет нормально. Но индекс генерируется из treeView (модель не работает). Как я могу связать выбор из представления с моделью, чтобы у меня был правильный Modelindex и я мог изменять данные в модели? И, конечно, как им обратно написать, что они синхронизируются? Другими словами, какой индекс мне нужен для чего, откуда и откуда они берутся?


person Papageno    schedule 29.09.2017    source источник
comment
Дерево просто делегирует любую имеющуюся модель. Таким образом, индексы всегда исходят из модели.   -  person ekhumoro    schedule 29.09.2017
comment
Спасибо! Это означает, например, если щелкнуть элемент в дереве, устанавливается индекс в модели. Так что у меня должна быть другая проблема ..   -  person Papageno    schedule 29.09.2017


Ответы (1)


Я бы хотел оставить комментарий, но у меня недостаточно репутации.

Поскольку ваша реализация модели не включает метод, который мог бы возвращать выбранный индекс, я должен получить его из pyqt5. Поскольку treeView является QTreeView, вы можете: treeView.selectionModel().selectedIndexes()

информация взята из здесь. Они вернут список QModelIndex, в котором есть api здесь. (обратите внимание, что хотя на этом веб-сайте есть примеры кода, он написан на C ++, но все равно должен быть читабельным)

В api вы можете получить строку и столбец, а также родительский объект из объекта QModelIndex.

Обычно я просто изменяю данные через объект, возвращаемый treeView.selectionModel (). SelectedIndexes ().

Например:

arr = treeView.selectionModel().selectedIndexes()
index = arr[0]

затем просто измените index.

но если вы ДОЛЖНЫ использовать свою собственную модель по какой-либо причине, вы можете сделать одно. Поскольку он расширяет QAbstractItemModel, вы можете использовать функцию индекса. Например:

arr = treeView.selectionModel().selectedIndexes()
indexTemp = arr[0]
index = model.index(indexTemp.row(), indexTemp.column(), indexTemp.parent())

затем измените значение с помощью функции setData

Но, как видите, получение того же объекта - дополнительный шаг.

person weichichi    schedule 29.09.2017