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