如何在QTreeView的每个项目上放置图标(如文件夹图标)

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

我想在QTreeView的每个项目名称处放置一个文件夹图标(和一个自定义图标)(如qtpy5)。我的意图是使用定制的目录数据制作自己的资源管理器。我试图搜索是否有一种方法可以使用QTreeView目录中的文件夹图标(例如https://github.com/pyqt/examples/tree/_/src/12%20QTreeView%20example%20in%20Python),但是我不知道如何将其带到我的文件夹中。如果我应该使用自定义图标,我想我会将图标放在“ ../icons”上,这意味着文件夹图标的位置将是“ ../ icons / folder.png”

import sys
from collections import deque
from PyQt5 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self, data):
        super(Window, self).__init__()
        self.tree = QtWidgets.QTreeView(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tree)
        self.model = QtGui.QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['Folder Name'])
        self.tree.header().setDefaultSectionSize(180)
        self.tree.setModel(self.model)
        self.importData(data)
        self.tree.expandAll()

    def importData(self, data, root=None):
        self.model.setRowCount(0)
        if root is None:
            root = self.model.invisibleRootItem()
        seen = {}
        values = deque(data)
        while values:
            value = values.popleft()
            if value['level'] == 0:
                parent = root
            else:
                pid = value['parent_ID']
                if pid not in seen:
                    values.append(value)
                    continue
                parent = seen[pid]
            dbid = value['dbID']
            parent.appendRow([
                QtGui.QStandardItem(value['name']),
                #QtGui.QStandardItem(str(dbid)), #showing dbID
                ])
            seen[dbid] = parent.child(parent.rowCount() - 1)

if __name__ == '__main__':

    data = [
        {'level': 0, 'dbID': 1, 'parent_ID': 0, 'name': 'folder a'} ,
        {'level': 1, 'dbID': 2, 'parent_ID': 1, 'name': 'folder b'} ,
        {'level': 0, 'dbID': 3, 'parent_ID': 0, 'name': 'folder c'} ,
        {'level': 1, 'dbID': 4, 'parent_ID': 3, 'name': 'folder d'} ,
        {'level': 2, 'dbID': 5, 'parent_ID': 4, 'name': 'folder e'} ,
        {'level': 0, 'dbID': 6, 'parent_ID': 0, 'name': 'folder f'} ,
        {'level': 1, 'dbID': 7, 'parent_ID': 6, 'name': 'folder g'} ,
        {'level': 0, 'dbID': 8, 'parent_ID': 0, 'name': 'folder bc'} ,
        {'level': 2, 'dbID': 9, 'parent_ID': 5, 'name': 'folder ee'}
        ]

    app = QtWidgets.QApplication(sys.argv)
    window = Window(data)
    window.setGeometry(600, 50, 400, 250)
    window.show()
    sys.exit(app.exec_())

python pyqt pyqt5
1个回答
0
投票

QStandardItem :: setIcon(const QIcon&icon)

将项目的图标设置为指定的图标。

import sys
from collections import deque
from PyQt5 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self, data):
        super(Window, self).__init__()
        self.tree = QtWidgets.QTreeView(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tree)
        self.model = QtGui.QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['Folder Name'])
        self.tree.header().setDefaultSectionSize(180)
        self.tree.setModel(self.model)
        self.importData(data)
        self.tree.expandAll()

    def importData(self, data, root=None):
        self.model.setRowCount(0)
        if root is None:
            root = self.model.invisibleRootItem()
        seen = {}
        values = deque(data)
        while values:
            value = values.popleft()
            if value['level'] == 0:
                parent = root
            else:
                pid = value['parent_ID']
                if pid not in seen:
                    values.append(value)
                    continue
                parent = seen[pid]
            dbid = value['dbID']
            parent.appendRow([
                QtGui.QStandardItem(value['name']),
                #QtGui.QStandardItem(str(dbid)), #showing dbID
                ])

            parent.setIcon(QtGui.QIcon('Ok.png'))                     # <---

            seen[dbid] = parent.child(parent.rowCount() - 1)


if __name__ == '__main__':

    data = [
        {'level': 0, 'dbID': 1, 'parent_ID': 0, 'name': 'folder a'} ,
        {'level': 1, 'dbID': 2, 'parent_ID': 1, 'name': 'folder b'} ,
        {'level': 0, 'dbID': 3, 'parent_ID': 0, 'name': 'folder c'} ,
        {'level': 1, 'dbID': 4, 'parent_ID': 3, 'name': 'folder d'} ,
        {'level': 2, 'dbID': 5, 'parent_ID': 4, 'name': 'folder e'} ,
        {'level': 0, 'dbID': 6, 'parent_ID': 0, 'name': 'folder f'} ,
        {'level': 1, 'dbID': 7, 'parent_ID': 6, 'name': 'folder g'} ,
        {'level': 0, 'dbID': 8, 'parent_ID': 0, 'name': 'folder bc'} ,
        {'level': 2, 'dbID': 9, 'parent_ID': 5, 'name': 'folder ee'}
        ]

    app = QtWidgets.QApplication(sys.argv)
    window = Window(data)
    window.setGeometry(600, 50, 400, 250)
    window.show()
    sys.exit(app.exec_())

enter image description here

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