PyQT5 QTreeWidget 获取被点击元素的完整路径
PyQT5 QTreeWidget get full path of clicked element
希望大家平安健康。我的问题只是我正在尝试制作一个视频播放器,并且我有 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
- File_1.1.2.mp4
- 文件夹 1.2
当我双击 File_1.1.2 我想要得到类似的东西(这就是我播放视频的方式):
Folder_1/Folder_1.1/File_1.1.2.mp4
但我得到了这个:
<main.Window object at 0x00000275AC0FD558> PyQt5.QtWidgets.QTreeWidgetItem object at 0x00000275AC0FD828>
欢迎任何帮助。提前谢谢你
您需要做的是遍历项目的父项并将它们连接起来:
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)])
<b>parent_itm.setData(0, Qt.UserRole, path_info)</b>
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):
<b>print(item.data(0, Qt.UserRole))</b>
希望大家平安健康。我的问题只是我正在尝试制作一个视频播放器,并且我有 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
- File_1.1.2.mp4
- 文件夹 1.2
- Folder_1.1
当我双击 File_1.1.2 我想要得到类似的东西(这就是我播放视频的方式):
Folder_1/Folder_1.1/File_1.1.2.mp4
但我得到了这个:
<main.Window object at 0x00000275AC0FD558> PyQt5.QtWidgets.QTreeWidgetItem object at 0x00000275AC0FD828>
欢迎任何帮助。提前谢谢你
您需要做的是遍历项目的父项并将它们连接起来:
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)])
<b>parent_itm.setData(0, Qt.UserRole, path_info)</b>
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):
<b>print(item.data(0, Qt.UserRole))</b>