import typing import qtawesome from PyQt5 import QtGui,QtCore,QtWidgets from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt, QVariant, QSize import sys from PyQt5.QtWidgets import (QApplication, QHeaderView, QStyle, QStyleOptionButton, QTableView, QAbstractItemView) from PyQt5.QtCore import (pyqtSignal, Qt, QAbstractTableModel, QModelIndex, QRect, QVariant) from PyQt5.QtWidgets import QItemDelegate, QHBoxLayout, QWidget, QTableView from .ModbusModel import * from .AnalogModel import * from .HartModel import * from .HartSimulateModel import * from .TCRTDModel import * from UI.VarManages.Thread import RTDTCThread, AnalogThread, FFSimulateThread, HartSimulateThread from utils import Globals class CheckBoxHeader(QHeaderView): checkClicked = pyqtSignal(bool) sectionClicked = pyqtSignal(int) _x_offset = 4 _y_offset = 0 _width = 25 _height = 25 def __init__(self, orientation=Qt.Horizontal, parent=None, changeY = None): self.isOn = False self.changeY = changeY super(CheckBoxHeader, self).__init__(orientation, parent) def paintSection(self, painter, rect, logicalIndex): painter.save() super(CheckBoxHeader, self).paintSection(painter, rect, logicalIndex) painter.restore() if self.changeY: self._y_offset = int((rect.height()-self._width)/2.) + 4 else: self._y_offset = int((rect.height()-self._width)/2.) if logicalIndex == 0: option = QStyleOptionButton() option.rect = QRect(rect.x() + self._x_offset, rect.y() + self._y_offset, self._width, self._height) option.state = QStyle.State_Enabled | QStyle.State_Active if self.isOn: option.state |= QStyle.State_On else: option.state |= QStyle.State_Off self.style().drawControl(QStyle.CE_CheckBox, option, painter) def mousePressEvent(self, event): index = self.logicalIndexAt(event.pos()) if 0 == index: x = self.sectionPosition(index) if x + self._x_offset < event.pos().x() < x + self._x_offset + self._width and self._y_offset < event.pos().y() < self._y_offset + self._height: if self.isOn: self.isOn = False else: self.isOn = True self.checkClicked.emit(self.isOn) self.update() else: self.sectionClicked.emit(index) super(CheckBoxHeader, self).mousePressEvent(event) class VarTableView(QTableView): def __init__(self, parent=None): super(VarTableView, self).__init__(parent) self.parent = parent self.setHeader() self.setupUi() def setHeader(self): founctionItem = ['Coil Status', 'Input Status', 'Input Register', 'Holding Register'] modbusTypeComboxItem = ['MODBUSTCP主站模式', 'MODBUSTCP从站模式', 'MODBUSRTU主站模式', 'MODBUSRTU从站模式'] self.setItemDelegateForColumn(11, VarButtonDelegate(self)) self.setItemDelegateForColumn(5, ModbusTypeBox(founctionItem, 'founctionCombox', self)) self.setItemDelegateForColumn(10, ModbusTypeBox(modbusTypeComboxItem, 'modbusTypeCombox', self)) self.model = VarTableModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', '从站地址', '寄存器地址', '工程量下限', '工程量上限', '通讯类型', '操作'],[], table = self) def setupUi(self): self.setShowGrid(True) self.setAlternatingRowColors(True) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setModel(self.model) self.header = CheckBoxHeader() self.header.setStretchLastSection(True) self.header.setSectionResizeMode(QHeaderView.Stretch) self.header.checkClicked.connect(self.model.headerClick) self.setHorizontalHeader(self.header) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.header.setSectionResizeMode(0, QHeaderView.Fixed) self.header.resizeSection(0, 70) class HartTableView(VarTableView): def __init__(self, parent=None): super(HartTableView, self).__init__(parent) def setHeader(self): self.setItemDelegateForColumn(8, HartButtonDelegate(self)) self.model = HartModel([' ID', '仪器名', '描述', '电流值', '参数1', '参数2','参数3', '参数4','操作'], [], table=self) class TcRtdTableView(VarTableView): def __init__(self, parent=None): super(TcRtdTableView, self).__init__(parent) self.setItemDelegateForColumn(5, TcRtdTypeDelegate(self)) self.valueList = [0] * 16 self.mvList = [0] * 16 self.workThread = RTDTCThread(self) Globals.setValue('RTDTCThread', self.workThread) # self.workThread.getValueList.connect(self.getValueList) def setHeader(self): self.setItemDelegateForColumn(9, TcRtdButtonDelegate(self)) self.model = TcRtdModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', '工程量下限', '工程量上限', '补偿值', '操作'], [], table=self) class AnalogTableView(VarTableView): def __init__(self, parent=None): super(AnalogTableView, self).__init__(parent) self.valueList = [0] * 8 + [0] * 8 + [0] * 8 self.realList = [0] * 8 + [0] * 8 + [0] * 8 self.workThread = AnalogThread(self) Globals.setValue('AnalogThread', self.workThread) def setHeader(self): self.setItemDelegateForColumn(8, AnalogButtonDelegate(self)) self.model = AnalogModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', '工程量下限', '工程量上限', '操作'], [], table=self) class FFSimulateTableView(VarTableView): def __init__(self, parent=None): super(FFSimulateTableView, self).__init__(parent) self.valueList = [] # self.realList = [0] * 8 + [0] * 8 + [0] * 8 self.workThread = FFSimulateThread(self) Globals.setValue('FFSimulateThread', self.workThread) # print(self.workThread) def setHeader(self): self.setItemDelegateForColumn(6, FFSimulateButtonDelegate(self)) self.model = FFSimulateModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', '操作'], [], table=self) class HartSimulateTableView(VarTableView): def __init__(self, parent=None): super(HartSimulateTableView, self).__init__(parent) self.valueList = [] # self.realList = [0] * 8 + [0] * 8 + [0] * 8 self.workThread = HartSimulateThread(self) Globals.setValue('HartSimulateThread', self.workThread) def setHeader(self): self.setItemDelegateForColumn(9, HartSimulateButtonDelegate(self)) self.model = HartSimulateModel([' ID', '仪器名', '描述', '主变量', '过程变量1', '过程变量2', '过程变量3', '工程量下限', '工程量上限', '操作'], [], table=self)