1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| import PyQt5.Qt import PyQt5.QtGui from PyQt5.QtCore import QAbstractItemModel, QVariant, QModelIndex, Qt
class TreeItem:
def __init__(self, data, parent = None): self.parentItem = parent self.childItems = [] self.itemData = data self._row = -1
def appendChild(self, child): child.setRow(len(self.childItems)) self.childItems.append(child)
def child(self, row): return self.childItems[row]
def childCount(self): return len(self.childItems)
def columnCount(self): return len(self.itemData)
def data(self, column): return self.itemData[column]
def setRow(self, row: int): self._row = row
def row(self): return self._row
def parent(self): return self.parentItem
class TreeModel(QAbstractItemModel):
def __init__(self, parent = None): super(TreeModel, self).__init__() self.rootItem = None self.updataData()
def data(self, index: QModelIndex, role: int = ...): if not index.isValid(): return QVariant() if role == Qt.DecorationRole and index.column() == 0: return PyQt5.QtGui.QIcon("images/snapshot.png") if role == Qt.DisplayRole: item = index.internalPointer() return item.data(index.column()) return QVariant()
def flags(self, index: QModelIndex): if not index.isValid(): return 0 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...) -> QVariant: if orientation == Qt.Horizontal and role == Qt.DisplayRole: return self.rootItem.data(section) return QVariant()
def index(self, row: int, column: int, parent: QModelIndex = ...) -> QModelIndex: if not self.hasIndex(row, column, parent): return QModelIndex() if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() childItem = parentItem.child(row) if childItem: return self.createIndex(row, column, childItem) else: return QModelIndex()
def parent(self, index: QModelIndex) -> QModelIndex: if not index.isValid(): return QModelIndex() childItem = index.internalPointer() parentItem = childItem.parent() if parentItem == self.rootItem: return QModelIndex() return self.createIndex(parentItem.row(), 0, parentItem)
def rowCount(self, parent: QModelIndex = ...) -> int: if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() return parentItem.childCount()
def columnCount(self, parent: QModelIndex = ...) -> int: return self.rootItem.columnCount()
def setupModelData(self, parent): for i in range(10): datas = [f"设备-{i + 1}", f"类型-{i + 1}"] primary = TreeItem(datas, parent) parent.appendChild(primary)
for j in range(2): ds = [f"子设备-{j + 1}", f"子类型-{j + 1}"] primary.appendChild(TreeItem(ds, primary))
def updataData(self): if self.rootItem: del self.rootItem self.rootItem = None
rootData = ['Tag', 'Type'] self.rootItem = TreeItem(rootData) self.setupModelData(self.rootItem)
|