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.
DCS/UI/VarManages/FFTreeView.py

163 lines
6.5 KiB
Python

import time
import qtawesome
from PyQt5.QtCore import QTimer, QModelIndex, QThread, pyqtSignal, Qt, QSortFilterProxyModel
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QApplication, QTreeView, QWidget, QVBoxLayout, QStyleFactory, QItemDelegate, QPushButton, QHBoxLayout, QMessageBox, QHeaderView, QSpacerItem, QSizePolicy
from protocol.FF import FFProtocol
from utils import Globals
from UI.VarManages.Thread import FFThread
class ParamView(QTreeView):
def __init__(self, FFCom):
super().__init__()
self.elemValueItems = []
self.paramIndexs = []
self.expandedParams = []
self.FFCom = FFCom
# 创建 QStandardItemModel 对象并初始化数据
self.model = QStandardItemModel()
self.setObjectName('paramView')
self.header().setObjectName('paramHeader')
# self.header().setSectionResizeMode(QHeaderView.Stretch)
#
# 创建 QTreeView 控件并绑定 QStandardItemModel
# self.treeview = QTreeView()
# self.proxy = QSortFilterProxyModel(self)
# self.proxy.setSourceModel(self.model)
self.setModel(self.model)
self.setStyle(QStyleFactory.create('windows'))
self.WorkThread = FFThread(self.FFCom, self)
self.WorkThread.getExpandedSignal.connect(self.getExpandedParams)
self.WorkThread.refreshViewSignal.connect(self.updateData)
Globals.setValue('FFThread', self.WorkThread)
self.WorkThread.start()
def initModel(self, dev, block):
# 初始化 QStandardItemModel 中的数据
# print(dev, block)
self.WorkThread.pause()
self.elemValueItems = []
self.paramIndexs = []
self.expandedParams = []
self.model.clear()
self.model.setHorizontalHeaderLabels(['变量名', '变量类型', '', '强制值 ', '操作'])
self.setItemDelegateForColumn(4, VarButtonDelegate(self))
self.header().setSectionResizeMode(QHeaderView.ResizeToContents)
# self.setColumnWidth(0, 200)
# self.setColumnWidth(1, 600)
# self.setColumnWidth(2, 600)
# self.setColumnWidth(3, 600)
# self.setColumnWidth(4, 600)
# self.header().setSectionResizeMode(0, QHeaderView.ResizeToContents)
# self.header().setSectionResizeMode(1, QHeaderView.ResizeToContents)
# self.header().setSectionResizeMode(2, QHeaderView.ResizeToContents)
# self.header().setSectionResizeMode(4, QHeaderView.ResizeToContents)
parentItem = self.model.invisibleRootItem()
for param in self.FFCom.getParams(dev, block):
# print(param)
paramNameItem = QStandardItem(param.name)
paramNameItem.param = param.param
paramTypeItem = QStandardItem(param.type)
paramNameItem.setEditable(False)
paramTypeItem.setEditable(False)
parentItem.appendRow([paramNameItem, paramTypeItem, QStandardItem(''), QStandardItem(''), QStandardItem('')])
for name, typeValue in param.getElements().items():
elemNameItem = QStandardItem(name)
elemTypeItem = QStandardItem(typeValue[0])
elemValueItem = QStandardItem(typeValue[1])
elemValueItem.elem = typeValue[2]
editItem = QStandardItem('')
self.elemValueItems.append(elemValueItem)
paramNameItem.appendRow([elemNameItem, elemTypeItem, elemValueItem, editItem, QStandardItem('')])
elemNameItem.setEditable(False)
elemTypeItem.setEditable(False)
elemValueItem.setEditable(False)
self.paramIndexs.append(self.model.indexFromItem(paramNameItem))
self.WorkThread.reStart()
# self.model.layoutChanged.emit()
def getExpandedParams(self):
self.expandedParams = []
for index in self.paramIndexs:
if self.isExpanded(index):
self.expandedParams.append(self.model.itemFromIndex(index).param)
# return self.expandedParams
def updateData(self):
# 更新 QStandardItemModel 中的数据
# self.model.clear()
# self.initModel()
#
# parent_item = self.model.invisibleRootItem()
for elemItem in self.elemValueItems:
elemItem.setText(elemItem.elem.ValueString())
class VarButtonDelegate(QItemDelegate):
"""该类用于向单元格中添加按钮 任务表格"""
def __init__(self, parent=None):
super(VarButtonDelegate, self).__init__(parent)
def paint(self, painter, option, index):
model = self.parent().model
# index = self.parent().proxy.mapToSource(index)
# print(index)
# try:
# self.parent().model.itemFromIndex(index).parent()
# except:
# return
if not self.parent().indexWidget(index) and self.parent().model.itemFromIndex(index).parent():
button = QPushButton(
qtawesome.icon('fa.play', color='#1fbb6f'),
"",
self.parent()
# clicked=self.edit_action
)
# button.setStyleSheet("border:none;")
button.index = index
button.clicked.connect(self.edit_action)
h_box_layout = QHBoxLayout()
verticalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
h_box_layout.addWidget(button)
h_box_layout.addItem(verticalSpacer)
h_box_layout.setContentsMargins(2, 0, 0, 2)
h_box_layout.setAlignment(Qt.AlignCenter)
widget = QWidget()
widget.setLayout(h_box_layout)
self.parent().setIndexWidget(
index,
widget
)
def edit_action(self):
# index = self.parent().currentIndex()
sender = self.sender()
index = sender.index
model = self.parent().model
# a = model.item(sender.index[0]).text()
elem = model.itemFromIndex(index).parent().child(index.row(), index.column() - 2).elem
param = model.itemFromIndex(index).parent().param
value = model.itemFromIndex(index).parent().child(index.row(), index.column() - 1).text()
try:
self.parent().FFCom.writeValue(param, elem, value)
except Exception as e:
print(e)
reply = QMessageBox.about(self.parent(), "错误", "写入失败")
# if __name__ == "__main__":
# app = QApplication([])
# window = MainWindow()
# window.show()
# app.exec_()