我想遍历QTreeWidget形成路径

问题描述 投票:0回答:1

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_())

python pyqt pyqt5
1个回答
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

以上是我的解决方案。通过叶节点查找到根节点的路径将非常低效。我不知道是否还有其他好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.