Python 在QTreeView中显示具有不同图标的文件夹/文件

Python 在QTreeView中显示具有不同图标的文件夹/文件,python,pyqt,pyside,qtreeview,Python,Pyqt,Pyside,Qtreeview,我用Python编写了一个函数,它遍历指定的目录,递归地获取其所有文件和子文件夹,并对其进行过滤,使其仅列出某些文件格式。如何在树视图中以不同的图标显示文件夹和文件 递归目录函数: def test(self): formats = ['.jpg', '.jpeg', '.txt'] for path, subdirs, files in os.walk(r'C:/Users/jmartini/Projects/Photogrammetry'): for fil

我用Python编写了一个函数,它遍历指定的目录,递归地获取其所有文件和子文件夹,并对其进行过滤,使其仅列出某些文件格式。如何在树视图中以不同的图标显示文件夹和文件

递归目录函数:

def test(self):
    formats = ['.jpg', '.jpeg', '.txt']

    for path, subdirs, files in os.walk(r'C:/Users/jmartini/Projects/Photogrammetry'):
        for file in files:
            filename, extension = os.path.splitext(file)

            if (extension.lower() in formats):
                f = os.path.join(path, file)
                print f
import sys
import os
from PySide import QtGui, QtCore


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):      
        # formatting
        self.resize(550, 400)
        self.setWindowTitle("Toychest")

        # widgets
        self.toollist = QtGui.QTreeView()

        # Tabs

        # signals

        # main layout
        mainLayout = QtGui.QGridLayout()
        mainLayout.setContentsMargins(0,0,0,0)
        mainLayout.addWidget(self.toollist)
        self.setLayout(mainLayout)

        # self.test()

# Functions
# ------------------------------------------------------------------------------
    def test(self):
        formats = ['.jpg', '.jpeg', '.txt']

        for path, subdirs, files in os.walk(r'C:/Users/jmartini/Projects/Photogrammetry'):
            for file in files:
                filename, extension = os.path.splitext(file)

                if (extension.lower() in formats):
                    f = os.path.join(path, file)
                    print f


# Main
# ------------------------------------------------------------------------------
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
概念

整个应用程序代码:

def test(self):
    formats = ['.jpg', '.jpeg', '.txt']

    for path, subdirs, files in os.walk(r'C:/Users/jmartini/Projects/Photogrammetry'):
        for file in files:
            filename, extension = os.path.splitext(file)

            if (extension.lower() in formats):
                f = os.path.join(path, file)
                print f
import sys
import os
from PySide import QtGui, QtCore


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):      
        # formatting
        self.resize(550, 400)
        self.setWindowTitle("Toychest")

        # widgets
        self.toollist = QtGui.QTreeView()

        # Tabs

        # signals

        # main layout
        mainLayout = QtGui.QGridLayout()
        mainLayout.setContentsMargins(0,0,0,0)
        mainLayout.addWidget(self.toollist)
        self.setLayout(mainLayout)

        # self.test()

# Functions
# ------------------------------------------------------------------------------
    def test(self):
        formats = ['.jpg', '.jpeg', '.txt']

        for path, subdirs, files in os.walk(r'C:/Users/jmartini/Projects/Photogrammetry'):
            for file in files:
                filename, extension = os.path.splitext(file)

                if (extension.lower() in formats):
                    f = os.path.join(path, file)
                    print f


# Main
# ------------------------------------------------------------------------------
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

在向树中添加新项时,它首先必须在树中找到它应该作为父项的项。比如说

path = '/path/to/file.jpg'
要在树中创建此项,我首先需要找到
路径
的顶级项。然后,我需要为
找到该项的子项。然后,我可以添加
文件.jpg

def find_or_create_item(self, path, parent=None):
    if parent is None:
        parent = self.tree.invisibleRootItem()
    names = path.lstrip('/').split('/')
    name = names[0]
    for i in range(parent.childCount()):
        child = parent.child(i)
        if child.text(0) == name:
            item = child
            break
    else:
        item = QTreeWidgetItem(name)
        parent.addChild(item)

    if names[1:]:
        return self.find_or_create_item('/'.join(names[1:], item)
    else:
        return item
在构建目录树时尝试使用和

QS标准的使用方法

例如:

import os
import PyQt4.QtGui

class Example(QtGui.QWidget):
    DEFAULT_DIR_PATH = 'C:/Users/jmartini/Projects/Photogrammetry'
    DIR_ICON_PATH = 'dir/icon/path/dir.jpg'
    FILE_ICON_PATH = 'file/icon/path/file.jpg'

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()
        self.initDirectory(DEFAULT_DIR_PATH)

    def initUI(self):      
        # formatting
        self.resize(550, 400)
        self.setWindowTitle("Toychest")

        # widgets
        self.toollist = QtGui.QTreeView()

        # QTreeView use QStandardItemModel as data source
        self.source_model = QtGui.QStandardItemModel()

        # Tabs

        # signals

        # main layout
        mainLayout = QtGui.QGridLayout()
        mainLayout.setContentsMargins(0,0,0,0)
        mainLayout.addWidget(self.toollist)
        self.setLayout(mainLayout)
        # set model for toollist
        self.toollist.setModel(self.source_model)

    def initDirectory(self, path):
        new_item = newItem(path)
        self.readDirectory(path, new_item)
        self.source_model.appendRow(new_item)

    def readDirectory(self, path, parent_item):
        directory = os.listdir(path)
        for file_name in directory:
            file_path = path + '/' + file_name
            new_item = newItem(file_path)
            parent_item.appendRow(new_item)
            if os.path.isdir(file_path):
                self.readDirectory(file_path, new_item)

    def newItem(self, path):
        title = os.path.basename(path)
        item = QtGui.QStandardItem()
        icon_path = FILE_ICON_PATH
        if os.path.isdir(file_path):
            icon_path = DIR_ICON_PATH
        icon = QtGui.QIcon(icon_path)
        item.setText(title)
        item.setIcon(icon)
        return item

您可以使用QTreeWidgetItem检查PyQT5函数以列出目录结构

如何添加收藏夹图标?