Showing filesystem in QTreeWidget
上面的链接是将文件系统放入QtreeWidget,然后我的需求和想法遍历QTreewidget,保存其叶节点的路径。
我本来想通过预遍历实现它,但失败了。
我也想到了一个坏主意。找到叶节点并找到其父节点可能很慢。
我想知道是否有个好主意或示例。
from PyQt5 import QtWidgets
from code.client.pdf_preprocessing_logic.ui.demo import Ui_Form
class Demo(QtWidgets.QWidget, Ui_Form):
def __init__(self, parent=None, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.setupUi(self)
self.text_list = []
self.on_modify_directory(self.item_0)
def on_modify_directory(self, node):
pass
def main():
import sys
app = QtWidgets.QApplication(sys.argv)
gui = Demo()
gui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'demo.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(424, 379)
self.treeWidget = QtWidgets.QTreeWidget(Form)
self.treeWidget.setGeometry(QtCore.QRect(50, 60, 301, 251))
self.treeWidget.setObjectName("treeWidget")
self.item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_1 = QtWidgets.QTreeWidgetItem(self.item_0)
item_2 = QtWidgets.QTreeWidgetItem(item_1)
item_3 = QtWidgets.QTreeWidgetItem(item_2)
item_2 = QtWidgets.QTreeWidgetItem(item_1)
item_1 = QtWidgets.QTreeWidgetItem(self.item_0)
item_2 = QtWidgets.QTreeWidgetItem(item_1)
item_2 = QtWidgets.QTreeWidgetItem(item_1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.treeWidget.headerItem().setText(0, _translate("Form", "a1"))
self.treeWidget.headerItem().setText(1, _translate("Form", "b1"))
__sortingEnabled = self.treeWidget.isSortingEnabled()
self.treeWidget.setSortingEnabled(False)
self.treeWidget.topLevelItem(0).setText(0, _translate("Form", "root"))
self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("Form", "a2"))
self.treeWidget.topLevelItem(0).child(0).child(0).setText(0, _translate("Form", "a21"))
self.treeWidget.topLevelItem(0).child(0).child(0).child(0).setText(0, _translate("Form", "a211"))
self.treeWidget.topLevelItem(0).child(0).child(1).setText(0, _translate("Form", "a22"))
self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("Form", "a3"))
self.treeWidget.topLevelItem(0).child(1).child(0).setText(0, _translate("Form", "a31"))
self.treeWidget.topLevelItem(0).child(1).child(1).setText(0, _translate("Form", "a32"))
self.treeWidget.setSortingEnabled(__sortingEnabled)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
答案 0 :(得分:0)
leaf_node_list = []
leaf_node_path_list = []
def on_modify_directory(self):
# Find all the leaf nodes and save them in leaf_node_list
iterator = QTreeWidgetItemIterator(self.catalog_tree_widget)
while iterator.value():
item = iterator.value()
if item.childCount() == 0:
self.leaf_node_list.append(item)
iterator += 1
for leaf_node in self.leaf_node_list:
self.leaf_node_path_list.append(self.get_parent_node(leaf_node))
def get_parent_node(self, leaf_node):
# Find the path to the root node based on the leaf node and stitch it into the path of the file system.
full_path_child = leaf_node.text(0)
full_path = ''
while leaf_node.parent() is not None:
full_path = os.path.join(leaf_node.parent().text(0), full_path_child)
full_path_child = full_path
leaf_node = leaf_node.parent()
return full_path
以上是我的解决方法。通过叶节点查找到根节点的路径将非常低效。我不知道还有没有其他好的方法。