You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.8 KiB
Python
102 lines
2.8 KiB
Python
from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt
|
|
from PyQt5.QtGui import QIcon
|
|
from PyQt5.QtWidgets import QDockWidget, QTreeView
|
|
|
|
|
|
class TreeDockWidget(QDockWidget):
|
|
def __init__(self, parent=None):
|
|
QDockWidget.__init__(self, parent=parent)
|
|
tree = QTreeView(self)
|
|
model = TreeDockModel()
|
|
tree.setModel(model)
|
|
self.setWidget(tree)
|
|
tree.clicked.connect(self.onTreeClicked)
|
|
|
|
def onTreeClicked(self, index: QModelIndex):
|
|
pass
|
|
|
|
|
|
class TreeItem(object):
|
|
def __init__(self):
|
|
self.data = None
|
|
self.parent = None
|
|
self.children = []
|
|
|
|
def appendChild(self, child: 'TreeItem') -> None:
|
|
child.parent = self
|
|
self.children.append(child)
|
|
|
|
|
|
class TreeDockModel(QAbstractItemModel):
|
|
def __init__(self):
|
|
QAbstractItemModel.__init__(self)
|
|
self.rootItem = None
|
|
self.updateData()
|
|
|
|
def updateData(self):
|
|
if self.rootItem:
|
|
self.rootItem = None
|
|
|
|
self.rootItem = TreeItem()
|
|
self.rootItem.data = 'ROOT'
|
|
|
|
for x in range(42):
|
|
primary = TreeItem()
|
|
primary.data = x
|
|
primary.parent = self.rootItem
|
|
self.rootItem.appendChild(primary)
|
|
|
|
def data(self, index=QModelIndex(), role=Qt.DisplayRole):
|
|
if not index.isValid():
|
|
return None
|
|
|
|
# 显示图标
|
|
if role == Qt.DecorationRole and index.column() == 0:
|
|
return QIcon()
|
|
|
|
# 显示数据
|
|
if role == Qt.DisplayRole:
|
|
item: TreeItem = index.internalPointer()
|
|
item.data = index.row()
|
|
return item.data
|
|
|
|
return None
|
|
|
|
def flags(self, index: QModelIndex) -> Qt.ItemFlags:
|
|
if not index.isValid():
|
|
return Qt.ItemIsAutoTristate
|
|
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsAutoTristate
|
|
|
|
def index(self, row: int, column: int, parent=QModelIndex()) -> QModelIndex:
|
|
if not self.hasIndex(row, column, parent):
|
|
return QModelIndex()
|
|
|
|
if not parent.isValid():
|
|
parentItem: TreeItem = self.rootItem
|
|
else:
|
|
parentItem: TreeItem = parent.internalPointer()
|
|
|
|
if row < len(parentItem.children):
|
|
childItem = parentItem.children[row]
|
|
return self.createIndex(row, column, childItem)
|
|
else:
|
|
return QModelIndex()
|
|
|
|
def parent(self, index: QModelIndex) -> QModelIndex:
|
|
if not index.isValid():
|
|
return QModelIndex()
|
|
|
|
child = index.internalPointer()
|
|
parent = child.parent
|
|
|
|
if parent == self.rootItem:
|
|
return QModelIndex()
|
|
|
|
return self.createIndex(parent.row(), 0, parent)
|
|
|
|
def columnCount(self, parent=QModelIndex()) -> int:
|
|
return 1
|
|
|
|
def rowCount(self, parent=QModelIndex()) -> int:
|
|
return 42
|