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.
163 lines
6.5 KiB
Python
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_()
|