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.
273 lines
11 KiB
Python
273 lines
11 KiB
Python
7 months ago
|
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 TcRtdModel(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 ['5']:
|
||
|
varDatas = TcRtdManage.getAllVar()
|
||
|
|
||
|
if not varDatas:
|
||
|
# self.layoutChanged.emit()
|
||
|
self.table.proxy.invalidate()
|
||
|
return
|
||
|
for x in varDatas:
|
||
|
x.insert(1, '')
|
||
|
x.insert(2, '')
|
||
|
self.datas.append(x)
|
||
|
x.append('')
|
||
|
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()][3] 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() == 2:
|
||
|
return self.table.valueList[QModelIndex.row()]# # 获取变量值并插入表格
|
||
|
# if QModelIndex.column() == 2:
|
||
|
|
||
|
|
||
|
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() or index.column() == 1 or index.column() == 8:
|
||
|
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEditable
|
||
|
return Qt.ItemIsEnabled
|
||
|
|
||
|
|
||
|
class TcRtdButtonDelegate(VarButtonDelegate):
|
||
|
"""该类用于向单元格中添加按钮 任务表格"""
|
||
|
|
||
|
def __init__(self, parent=None):
|
||
|
super(TcRtdButtonDelegate, 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
|
||
|
)
|
||
|
|
||
|
|
||
|
button1.clicked.connect(self.start_action)
|
||
|
button2.clicked.connect(self.edit_action)
|
||
|
|
||
|
button2.oldName = False
|
||
|
button2.isEdit = True
|
||
|
|
||
|
button1.index = [index.row(), index.column()]
|
||
|
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(button1)
|
||
|
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 start_action(self):
|
||
|
sender = self.sender()
|
||
|
model = self.parent().model
|
||
|
value = model.datas[sender.index[0]][1]
|
||
|
varType = model.datas[sender.index[0]][5]
|
||
|
min = model.datas[sender.index[0]][6]
|
||
|
max = model.datas[sender.index[0]][7]
|
||
|
compensation = model.datas[sender.index[0]][8]
|
||
|
pattern = re.compile(r'[^0-9\.-]+')
|
||
|
if not value or re.findall(pattern, str(value) + str(compensation)):
|
||
|
reply = QMessageBox.question(self.parent(),
|
||
|
'警告',
|
||
|
"请输入强制值或数字",
|
||
|
QMessageBox.Yes)
|
||
|
return
|
||
|
if min and max:
|
||
|
if float(value) < float(min) or float(value) > float(max):
|
||
|
reply = QMessageBox.question(self.parent(),
|
||
|
'警告',
|
||
|
"超出量程范围",
|
||
|
QMessageBox.Yes)
|
||
|
return
|
||
|
elif min and not max:
|
||
|
if float(value) < float(min):
|
||
|
reply = QMessageBox.question(self.parent(),
|
||
|
'警告',
|
||
|
"超出量程范围",
|
||
|
QMessageBox.Yes)
|
||
|
return
|
||
|
elif max and not min:
|
||
|
if float(value) > float(max):
|
||
|
reply = QMessageBox.question(self.parent(),
|
||
|
'警告',
|
||
|
"超出量程范围",
|
||
|
QMessageBox.Yes)
|
||
|
return
|
||
|
mv = temToMv(varType, float(value))
|
||
|
if not mv and mv != 0:
|
||
|
reply = QMessageBox.question(self.parent(),
|
||
|
'警告',
|
||
|
"输入值有误",
|
||
|
QMessageBox.Yes)
|
||
|
return
|
||
|
mv += float(compensation)
|
||
|
model.table.mvList[sender.index[0]] = mv
|
||
|
model.table.valueList[sender.index[0]] = float(value)
|
||
|
forceVars = Globals.getValue('forceVars')
|
||
|
forceVars.add(model.datas[sender.index[0]][3])
|
||
|
Globals.setValue('forceVars', forceVars)
|
||
|
|
||
|
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]][3]
|
||
|
model.editableList.append(sender.index[0])
|
||
|
else:
|
||
|
varMes = model.datas[sender.index[0]]
|
||
|
name, des, varType, min, max, compensationVar = str(varMes[3]), str(varMes[4]), str(varMes[5]),str(varMes[6]), str(varMes[7]), str(varMes[8])
|
||
|
if not name or not varType:
|
||
|
reply = QMessageBox.question(self.parent(),
|
||
|
'警告',
|
||
|
"有字段为空",
|
||
|
QMessageBox.Yes)
|
||
|
return
|
||
|
sender.isEdit = True
|
||
|
model.editableList.remove(sender.index[0])
|
||
|
if sender.oldName:
|
||
|
TcRtdManage.editVar(name=sender.oldName, Nname=name, des=des, varType=varType, min=min, max=max, compensationVar = compensationVar)
|
||
|
else:
|
||
|
TcRtdManage.createVar(varName=name, varType=varType, des=des, min=min, max=max, compensationVar = compensationVar)
|
||
|
sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
|
||
|
rowIndex = sender.index[0]
|
||
|
varMes = TcRtdManage.getByName(name)
|
||
|
varMes.insert(1, '')
|
||
|
varMes.insert(2, '')
|
||
|
varMes.append('')
|
||
|
model.insert_data(varMes, rowIndex)
|
||
|
model.remove_row(rowIndex + 1)
|
||
|
|
||
|
class TcRtdTypeDelegate(TcRtdButtonDelegate):
|
||
|
def __init__(self, parent=None):
|
||
|
super(TcRtdTypeDelegate, self).__init__(parent)
|
||
|
|
||
|
def paint(self, painter, option, index):
|
||
|
if not self.parent().indexWidget(index):
|
||
|
comboBox = QComboBox(self.parent())
|
||
|
if index.row() < 8:
|
||
|
item = ['R', 'S', 'B', 'J', 'T','E', 'K', 'N', 'C', 'A']
|
||
|
comboBox.addItems(item)
|
||
|
i = item.index(self.parent().model.datas[index.row()][index.column()])
|
||
|
comboBox.setCurrentIndex(i)
|
||
|
else:
|
||
|
item = ['PT100']
|
||
|
comboBox.addItems(item)
|
||
|
comboBox.currentIndexChanged.connect(self.indexChange)
|
||
|
comboBox.setObjectName('TcRtdTypeBox')
|
||
|
comboBox.setEditable(True)
|
||
|
comboBox.lineEdit().setAlignment(Qt.AlignCenter)
|
||
|
|
||
|
h_box_layout = QHBoxLayout()
|
||
|
h_box_layout.addWidget(comboBox)
|
||
|
h_box_layout.setContentsMargins(0, 0, 0, 0)
|
||
|
comboBox.index = [index.row(), index.column()]
|
||
|
widget = QWidget()
|
||
|
widget.setLayout(h_box_layout)
|
||
|
row = index.row()
|
||
|
if row % 2 == 0:
|
||
|
comboBox.setStyleSheet("QComboBox { background-color: #EFEFEF }")
|
||
|
else:
|
||
|
comboBox.setStyleSheet("QComboBox { background-color: #e9e7e3 }")
|
||
|
self.parent().setIndexWidget(
|
||
|
index,
|
||
|
widget
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
def indexChange(self):
|
||
|
sender = self.sender()
|
||
|
index = sender.currentIndex()
|
||
|
varType = sender.itemText(index)
|
||
|
name = self.parent().model.datas[sender.index[0]][3]
|
||
|
TcRtdManage.editvarType(name, varType)
|
||
|
self.parent().model.datas[sender.index[0]][sender.index[1]] = varType
|