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_()