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.

138 lines
4.2 KiB
Python

from PyQt5 import QtCore
from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt
from PyQt5.QtWidgets import QDockWidget, QTreeView
treeDict = {
'系统参数': 'sysParameter',
'通讯设备': 'comEqu',
'数据库配置': {
'设备变量': 'deviceVar',
'中间变量': 'intermediateVar',
'系统变量': 'deviceVar'
},
'数据库管理': 'databaseManage'
}
class TreeDockWidget(QDockWidget):
tree_Signal = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
QDockWidget.__init__(self, parent=parent)
self.parent = parent
tree = QTreeView(self)
tree.setHeaderHidden(True)
model = TreeDockModel()
tree.setModel(model)
self.setWidget(tree)
tree.clicked.connect(self.onTreeClicked)
def onTreeClicked(self, index: QModelIndex):
if index.parent().data() not in [self.parent, None]:
for i in treeDict:
if isinstance(treeDict[i], (dict)):
for name in treeDict[i]:
if name == index.data():
self.tree_Signal.emit(treeDict[i][name])
else:
if i == index.data():
self.tree_Signal.emit(treeDict[i])
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'
self.projectRoot = TreeItem()
self.projectRoot.data = '工程'
self.rootItem.appendChild(self.projectRoot)
for x in ['系统参数', '通讯设备', '数据库配置', '数据库管理', ]:
primary = TreeItem()
primary.data = x
primary.parent = self.rootItem
self.projectRoot.appendChild(primary)
self.addChild(x, primary)
self.layoutChanged.emit()
def addChild(self, tabelName, parent):
allList = treeDict[tabelName]
if isinstance(allList, (dict)):
for i in allList:
child = TreeItem()
child.data = i
child.parent = parent
parent.appendChild(child)
else:
return
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.internalPointer().data
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(index.row(), 0, parent)
def columnCount(self, parent=QModelIndex()) -> int:
return 1
def rowCount(self, parent=QModelIndex()) -> int:
return 999