首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QTreeView中显示具有不同图标的文件夹/文件

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

Stack Overflow用户
提问于 2016-06-13 14:00:50
回答 3查看 4.1K关注 0票数 3

我用Python编写了一个函数,它遍历指定的目录,递归地获取它的所有文件和子文件夹,并将其过滤为只列出特定的文件格式。如何在带有文件夹和文件的不同图标的treeview中显示这一点?

递归目录函数:

代码语言:javascript
复制
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

概念

整个应用程序代码:

代码语言:javascript
复制
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_())
EN

回答 3

Stack Overflow用户

发布于 2016-06-13 17:00:49

当向树中添加一个新项时,它首先必须在树中找到它应该对应的项。例如

代码语言:javascript
复制
path = '/path/to/file.jpg'

要在树中创建这个项,我首先需要找到path的顶级项。然后,我需要为to找到这个项目的一个子项目。然后,我可以添加file.jpg项。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-06-25 10:43:01

在构建目录树时尝试使用QStandardItemModelQStandardItem

使用setIcon方法的QStandardItem

例如:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-05-19 19:06:41

可以使用这里检查PyQT5函数以列出目录结构。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37791718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档