import typing import sys import qtawesome from PyQt5 import QtGui,QtCore,QtWidgets from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt, QVariant, QSize from PyQt5.QtWidgets import QItemDelegate, QHBoxLayout, QWidget, QTableView, QMessageBox, QComboBox from protocol.TCP.TemToMv import temToMv from protocol.TCP.Analog import getRealAO from model.ProjectModel.VarManage import * from UI.VarManages.ModbusModel import * from utils import Globals import re class HartSimulateModel(VarTableModel): def __init__(self, header, data: list, table = None): ''' header : 表头变量 data : 表格内容 table : 缺省参数 ''' VarTableModel.__init__(self, header, data, table = table) def initTable(self): self.datas = [] proType = Globals.getValue('currentProType') if proType in ['9']: varDatas = HartSimulateVarManage.getAllVar() if not varDatas: # self.layoutChanged.emit() self.table.proxy.invalidate() return for x in varDatas: for i in range(3, 10): x.insert(i, '') self.datas.append(x) self.checkList = ['Unchecked'] * len(self.datas) # self.layoutChanged.emit() self.table.proxy.invalidate() def data(self, QModelIndex, role=None): # print(Qt.__dict__.items()) if role == Qt.TextAlignmentRole: return Qt.AlignCenter if not QModelIndex.isValid(): print("行或者列有问题") return QVariant() if role == Qt.BackgroundColorRole: if QModelIndex.row() % 2 == 0 and self.datas[QModelIndex.row()][1] not in Globals.getValue('forceVars'): return QtGui.QColor('#EFEFEF') if self.datas[QModelIndex.row()][1] in Globals.getValue('forceVars'): return QtGui.QColor('#00FF7F') if role == Qt.TextColorRole: return QtGui.QColor('#1A1A1A') if role == Qt.CheckStateRole: if QModelIndex.column() == 0: return Qt.Checked if self.checkList[QModelIndex.row()] == 'Checked' else Qt.Unchecked else: return None if role == Qt.ToolTipRole: if QModelIndex.column() == 0: return self.checkList[QModelIndex.row()] if role == Qt.DisplayRole or role == Qt.EditRole: if QModelIndex.row() in self.editableList: return self.datas[QModelIndex.row()][QModelIndex.column()] if role != Qt.DisplayRole: return QVariant() # 获取变量值并插入表格 # if QModelIndex.column() in [3, 4, 5, 6, 7]: # # varName = self.datas[QModelIndex.row()][1] # # if varName != '': # # # print(uid) # try: # uid = MBTCPMApp.backend.get('HART').decode('utf-8') # res = AsyncResult(uid) # 参数为task id # if res.result: # result = res.result[QModelIndex.column() - 3] # if result or result in [0, '0']: # self.datas[QModelIndex.row()][QModelIndex.column()] = result # except: # pass return QVariant(self.datas[QModelIndex.row()][QModelIndex.column()]) def flags(self, index): if index.column() == 0: return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable if index.row() in self.editableList and index.column(): return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEditable if index.column() in range(3, 9): return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEditable return Qt.ItemIsEnabled class HartSimulateButtonDelegate(VarButtonDelegate): """该类用于向单元格中添加按钮 任务表格""" def __init__(self, parent=None): super(HartSimulateButtonDelegate, self).__init__(parent) def paint(self, painter, option, index): if not self.parent().indexWidget(index): button1 = QPushButton( qtawesome.icon('fa.play', color='#1fbb6f'), "", self.parent(), clicked=self.start_action ) button1.setIconSize(QSize(15, 15)) button1.setStyleSheet("border:none;") button2 = QPushButton( qtawesome.icon('fa.pencil', color='#4c8cf2'), "", self.parent(), clicked=self.edit_action ) # button4 = QPushButton( # qtawesome.icon('fa.line-chart', color='#393c4e'), # "", # self.parent(), # clicked=self.trend_action # ) # comboBox.currentIndexChanged.connect(self.indexChange) button1.clicked.connect(self.start_action) button2.clicked.connect(self.edit_action) # button3.clicked.connect(self.delete_action) # button4.clicked.connect(self.trend_action) button2.oldName = False button2.isEdit = True # button4.setStyleSheet("border:none;") button1.index = [index.row(), index.column()] button2.index = [index.row(), index.column()] # button3.index = [index.row(), index.column()] # button4.index = [index.row(), index.column()] # comboBox.index = [index.row(), index.column()] data = self.parent().model.datas[index.row()] for x in data[:-1]: if x != '': break else: button2.isEdit = False button2.setIcon(qtawesome.icon('fa.save', color='#1fbb6f')) self.parent().model.editableList.append(button2.index[0]) h_box_layout = QHBoxLayout() # h_box_layout.addWidget(comboBox) h_box_layout.addWidget(button1) # h_box_layout.addWidget(button2) # h_box_layout.addWidget(button3) # h_box_layout.addWidget(button4) 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): sender = self.sender() model = self.parent().model if sender.isEdit: sender.setIcon(qtawesome.icon('fa.save', color='#1fbb6f')) sender.isEdit = False sender.oldName = model.datas[sender.index[0]][1] model.editableList.append(sender.index[0]) else: varMes = model.datas[sender.index[0]] name, des = str(varMes[1]), str(varMes[2]) # print(name, des) if not name : reply = QMessageBox.question(self.parent(), '警告', "有字段为空", QMessageBox.Yes) return sender.isEdit = True model.editableList.remove(sender.index[0]) if sender.oldName: HartSimulateVarManage.editVar(name = sender.oldName, Nname = name, des = des) else: HartSimulateVarManage.createVar(varName = name, des = des) sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2')) rowIndex = sender.index[0] varMes = HartSimulateVarManage.getByName(name) model.insert_data(varMes, rowIndex) model.remove_row(rowIndex + 1) def start_action(self): sender = self.sender() model = self.parent().model # value2 = model.datas[sender.index[0]][4] # value3 = model.datas[sender.index[0]][5] # value4 = model.datas[sender.index[0]][5] value1 = model.datas[sender.index[0]][3] minSpan = model.datas[sender.index[0]][7] maxSpan = model.datas[sender.index[0]][8] writeList = [str(x) for x in model.datas[sender.index[0]][3:9]] pattern = re.compile(r'[^0-9\.-]+') if minSpan and maxSpan and value1 and not re.findall(pattern, str(value1) + str(minSpan) + str(maxSpan)): if float(value1) < float(minSpan) or float(value1) > float(maxSpan): reply = QMessageBox.question(self.parent(), '警告', "主变量超出量程", QMessageBox.Yes) return for index, value in enumerate(writeList): if re.findall(pattern, value): reply = QMessageBox.question(self.parent(), '警告', "请输入强制值或数字", QMessageBox.Yes) return try: self.parent().workThread.HartSimulate.writeValue(index, value) except: reply = QMessageBox.question(self.parent(), '警告', "请先打开通讯", QMessageBox.Yes) return forceVars = Globals.getValue('forceVars') forceVars.add(model.datas[sender.index[0]][1]) Globals.setValue('forceVars', forceVars)