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.

160 lines
6.1 KiB
Python

7 months ago
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
from UI.VarManages.BaseButtonDelegate import BaseButtonDelegate
4 months ago
7 months ago
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:
4 months ago
for i in range(3, 8):
7 months ago
x.insert(i, '')
4 months ago
x.append('')
7 months ago
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(BaseButtonDelegate):
7 months ago
"""该类用于向单元格中添加按钮 任务表格"""
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
# 使用基类的验证方法获取行索引
view_row, source_row = self._validate_button_indices(sender)
if view_row is None:
return
7 months ago
if sender.isEdit:
sender.setIcon(qtawesome.icon('fa.save', color='#1fbb6f'))
sender.isEdit = False
sender.oldName = model.datas[source_row][1]
model.editableList.append(source_row)
7 months ago
else:
varMes = model.datas[source_row]
7 months ago
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(source_row)
7 months ago
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'))
varMes = HartVarManage.getByName(name)
model.insert_data(varMes, source_row)
model.remove_row(source_row + 1)