You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QStandardItem无findItems属性报错:TreeView路径组织代码排查

QTreeView路径组织报错:AttributeError分析与解决

问题重现

尝试在QTreeView中组织多条文件路径时,代码运行报错:

AttributeError: 'QStandardItem' object has no attribute 'findItems'
its like QStandardItem do no have a function to find the item

问题原因

QStandardItem类并没有findItems方法,这个查找方法是QStandardItemModel独有的。代码中当parent为QStandardItem对象时,直接调用parent.findItems(text),这就触发了属性不存在的错误。

解决方案

要查找父节点下的子项,需要遍历父节点的所有子项进行文本匹配。修改get_or_create_item方法并优化路径处理逻辑即可解决问题:

修改后的完整代码

import sys
from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeView, QVBoxLayout, QWidget

class TreeViewExample(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("QTreeView Example")
        self.setGeometry(100, 100, 800, 600)

        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)

        self.tree_view = QTreeView(self.central_widget)
        self.model = QtGui.QStandardItemModel()
        self.tree_view.setModel(self.model)

        # 自定义文件路径列表
        file_paths = [
            "/home/user/documents/file1.txt",
            "/home/user/documents/folder1/file2.txt",
            "/home/user/documents/folder1/file3.txt",
            "/home/user/pictures/photo1.jpg",
            "/home/user/pictures/folder2/photo2.jpg",
        ]

        # 组织路径为树形层级
        self.organize_paths(file_paths)

        # 设置布局
        layout = QVBoxLayout(self.central_widget)
        layout.addWidget(self.tree_view)

    def organize_paths(self, file_paths):
        for path in file_paths:
            components = path.split("/")
            current_parent = None

            for component in components:
                # 跳过空字符串(路径开头的/分割后会产生空元素)
                if not component:
                    continue
                item = self.get_or_create_item(component, parent=current_parent)
                current_parent = item

    def get_or_create_item(self, text, parent=None):
        # 查找已有项
        if parent:
            # 遍历父节点的所有子项匹配文本
            for row in range(parent.rowCount()):
                child_item = parent.child(row)
                if child_item.text() == text:
                    return child_item
        else:
            # 根节点从模型查找
            items = self.model.findItems(text)
            if items:
                return items[0]
        
        # 没有找到则创建新项
        item = QtGui.QStandardItem(text)
        if parent:
            parent.appendRow(item)
        else:
            self.model.appendRow(item)
        return item

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TreeViewExample()
    window.show()
    sys.exit(app.exec_())

额外优化说明

  • 新增空字符串跳过逻辑:解决路径开头/分割后产生空元素的问题,避免创建无用的空节点。
  • 父节点子项查找改为遍历匹配,完全符合QStandardItem的API规范。

内容的提问来源于stack exchange,提问作者amine jisung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:07:36