import qtawesome from PyQt5 import QtGui from PyQt5.QtCore import Qt, QVariant from PyQt5.QtWidgets import QHBoxLayout, QWidget, QMessageBox from model.ProjectModel.VarManage import * from UI.VarManages.ModbusModel import * from utils import Globals class HartModel(VarTableModel): def __init__(self, header, data: list, table = None): ''' header : 表头变量 data : 表格内容 table : 缺省参数 ''' VarTableModel.__init__(self, header, data, table = table) def initTable(self): self.datas = [] varDatas = HartVarManage.getAllVar() if not varDatas: # self.layoutChanged.emit() self.table.proxy.invalidate() return for x in varDatas: for i in range(3, 8): x.insert(i, '') x.append('') 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()][3] 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 return Qt.ItemIsEnabled class HartButtonDelegate(VarButtonDelegate): """该类用于向单元格中添加按钮 任务表格""" def __init__(self, parent=None): super(HartButtonDelegate, self).__init__(parent) def paint(self, painter, option, index): if not self.parent().indexWidget(index): button2 = QPushButton( qtawesome.icon('fa.pencil', color='#4c8cf2'), "", self.parent(), clicked=self.edit_action ) button2.clicked.connect(self.edit_action) button2.oldName = False button2.isEdit = True button2.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(button2) 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]) if not name : reply = QMessageBox.question(self.parent(), '警告', "有字段为空", QMessageBox.Yes) return sender.isEdit = True model.editableList.remove(sender.index[0]) if sender.oldName: HartVarManage.editVar(name = sender.oldName, Nname = name, des = des) else: HartVarManage.createVar(varName = name, des = des) sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2')) rowIndex = sender.index[0] varMes = HartVarManage.getByName(name) model.insert_data(varMes, rowIndex) model.remove_row(rowIndex + 1)