PyQT5 QTreeWidget получает полный путь к выбранному элементу

Я надеюсь, что вы все живы и здоровы. Моя проблема в том, что я просто пытаюсь создать видеоплеер, и у меня есть QTreeWidget с элементами (папками и файлами) из заданного пути. Я хочу воспроизвести видео при двойном щелчке по элементу в QTreeWidget.

# How I create tree, fill and detect double click.
self.tree = QTreeWidget()
self.load_project_structure("resources/videos", self.tree)
self.tree.itemDoubleClicked.connect(self.handler)

def load_project_structure(self, startpath, tree):
    for element in os.listdir(startpath):
        path_info = startpath + "/" + element
        parent_itm = QTreeWidgetItem(tree, [os.path.basename(element)])
        if os.path.isdir(path_info):
            self.load_project_structure(path_info, parent_itm)
            parent_itm.setIcon(0, QIcon('img/folder.png'))
        else:
            parent_itm.setIcon(0, QIcon('img/file.png'))

def handler(item, column_no):
    print(item, column_no)

Мое дерево просто так:

  • Folder_1
    • Folder_1.1
      • File_1.1.1.mp4
      • Файл_1.1.2.mp4
    • Папка 1.2

Когда я дважды щелкаю File_1.1.2, я хочу получить что-то подобное (и именно так я могу воспроизводить видео):

Папка_1/Папка_1.1/Файл_1.1.2.mp4

но я получил это:

main.Объект Window по адресу 0x00000275AC0FD558> Объект PyQt5.QtWidgets.QTreeWidgetItem по адресу 0x00000275AC0FD828>

Любая помощь приветствуется. заранее спасибо


person justRandomLearner    schedule 19.04.2020    source источник
comment
Вы получили это от чего именно?   -  person musicamante    schedule 20.04.2020
comment
Извините, что не упомянул. это был напечатан вывод из функции обработчика.   -  person justRandomLearner    schedule 20.04.2020


Ответы (1)


Что вам нужно сделать, так это перебрать родителей элементов и соединить их:

def handler(self, item, column_no):
    texts = []
    while item is not None:
        texts.append(item.text(0))
        item = item.parent()
    path = "/".join(texts)
    print(path)

Другой более простой способ — использовать роль для хранения полного пути.

def load_project_structure(self, startpath, tree):
    for element in os.listdir(startpath):
        path_info = os.path.join(startpath, element)
        parent_itm = QTreeWidgetItem(tree, [os.path.basename(element)])
        parent_itm.setData(0, Qt.UserRole, path_info)
        if os.path.isdir(path_info):
            self.load_project_structure(path_info, parent_itm)
            parent_itm.setIcon(0, QIcon('img/folder.png'))
        else:
            parent_itm.setIcon(0, QIcon('img/file.png'))

def handler(self, item, column_no):
    print(item.data(0, Qt.UserRole))
person eyllanesc    schedule 19.04.2020