Получение полного имени индекса из выбора в QTreeView

Я создал QTreeView с помощью PyQt, где в TreeView он заполнен следующей иерархией:

|- users
|--|-- John
|--|--|--- graphics
|--|-- Alice

В моем TreeView я выбрал graphics.

Пока я могу получить индекс / имя выбора следующим образом:

for sel in self.tree_view.selectedIndexes():
    sel_name = sel.data()

Приведенный выше код вернет мне только graphics. Как я могу получить «полный» путь, чтобы он возвращал мне «/ users / John / graphics»?


person dissidia    schedule 27.07.2018    source источник


Ответы (1)


Чтобы получить полное имя индекса, необходимо выполнить итерацию по родительским элементам, как показано ниже:

for sel in self.tree_view.selectedIndexes():
    val = "/"+sel.data()
    while sel.parent().isValid():
        sel = sel.parent()
        val = "/"+ sel.data()+ val
    print(val)

Пример:

from PyQt5 import QtCore, QtGui, QtWidgets

tree = {
'users': {
    "John" : ["graphics"],
    "Alice": []
    }
}

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.tree_view = QtWidgets.QTreeView()
        self.setCentralWidget(self.tree_view)

        model = QtGui.QStandardItemModel()
        self.populateTree(tree, model.invisibleRootItem())
        self.tree_view.setModel(model)
        self.tree_view.expandAll()
        self.tree_view.selectionModel().selectionChanged.connect(self.onSelectionChanged)

    def populateTree(self, children, parent):
        for child in children:
            child_item = QtGui.QStandardItem(child)
            parent.appendRow(child_item)
            if isinstance(children, dict):
                self.populateTree(children[child], child_item)

    def onSelectionChanged(self, *args):
        for sel in self.tree_view.selectedIndexes():
            val = "/"+sel.data()
            while sel.parent().isValid():
                sel = sel.parent()
                val = "/"+ sel.data()+ val
            print(val)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 27.07.2018