Как получить данные из диалога обратно в древовидную структуру pyqt5 python 3 - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть древовидная структура, и когда пользователь нажимает на столбец типа данных, появляется диалоговое окно, которое

Treeview

Вот это диалоговое окно

enter image description here

Мне интересно, как лучше всего обновить дерево с помощью значения из диалогового окна.

Я попытался удалить и setItem, но строка, которую я получаю из моего объекта индекса, не всегда является индексом строки, если эта строка является дочерней, а не родительской.

Этот код работает и изменяет значение в дереве

datadialog = DataDialogNoParent()
datadialog.popDialogBox(index)
datadialog.exec_()
self.model.setItem(index.row(),index.column(),QStandardItem(datadialog.choice))

Когда я пытаюсь изменить эти дочерние элементы, я получаю странные результаты, используя строки и столбцы из объекта QModelIndex.

enter image description here

1 Ответ

0 голосов
/ 02 апреля 2020

tl; dr

Использование self.model.setData(index, datadialog.choice, QtCore.Qt.DisplayRole).

Объяснение

Давайте посмотрим аргументы setItem():

QStandardItemModel.setItem(row, column, item)

Можно указать только строку и столбец. Как модель должна знать, хотите ли вы установить элемент child ? И потомок чего?

setItem() работает только для двумерных моделей данных (или таблиц), но вы используете модель в виде дерева, что означает, что каждый индекс может иметь свои собственные дочерние индексы (каждый из которых имеет свою строку и столбец относительно своего родителя).
То, что вы получаете от index.row() и index.column(), относится к координатам относительно индекса parent().

В вашем случае выделенный элемент находится в строке 1 и столбце 1, поэтому использование setItem() приведет к установке элемента во второй строке и столбце модели root (при условии, что элемент существует в этих координатах).

Использование setData позволяет установить данные для указанного индекса c, поскольку для этого используются три его координаты: строка, столбец и parent . Обратите внимание, что аргумент QtCore.Qt.DisplayRole является обязательным, потому что по умолчанию QStandardItemModel использует EditRole.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...