【问题标题】:Display folders/files with different icons in QTreeView在 QTreeView 中显示具有不同图标的文件夹/文件
【发布时间】:2016-10-13 23:42:50
【问题描述】:

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

【问题讨论】:

    标签: python pyqt pyside qtreeview


    【解决方案1】:

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

    path = '/path/to/file.jpg'
    

    要在树中创建这个项目,我首先需要找到path 的顶级项目。然后,我需要为to 找到该项目的子项。然后,我可以添加file.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
    

    【讨论】:

      【解决方案2】:

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

      使用 QStandardItem 的setIcon 方法

      例如:

      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
      

      【讨论】:

      • 如何添加收藏图标?
      【解决方案3】:

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

      【讨论】:

      • 那不是使用 QTreeView。
      猜你喜欢
      • 2021-06-25
      • 2019-04-03
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      相关资源
      最近更新 更多