from PyQt5 import QtCore from PyQt5.QtWidgets import QHeaderView, QStyle, QStyleOptionButton, QTableView, QAbstractItemView, QDesktopWidget from PyQt5.QtCore import (pyqtSignal, Qt, QRect) from PyQt5.QtWidgets import QTableView from .ModbusModel import * from .AnalogModel import * from .HartModel import * from .HartSimulateModel import * from .TCRTDModel import * from model.ProjectModel.VarManage import * from UI.VarManages.Thread import RTDTCThread, AnalogThread, 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, modbusType, parent=None): super(VarTableView, self).__init__(parent) self.parent = parent self.modbusType = modbusType self.setHeader() self.setupUi() def setHeader(self): self.setItemDelegateForColumn(11, VarButtonDelegate(self)) self.setItemDelegateForColumn(5, ModbusTypeBox(self)) self.setItemDelegateForColumn(10, ModbusVarModelBox(self)) self.model = VarTableModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', '从站地址', '寄存器地址', '工程量下限', '工程量上限', '值类型', '操作'], [], modbusType = self.modbusType, 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.checkClicked.connect(self.model.headerClick) self.setHorizontalHeader(self.header) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setupColumnWidths() self.header.setSectionResizeMode(0, QHeaderView.Fixed) self.header.resizeSection(0, 70) def setupColumnWidths(self): self.setCustomColumnWidths([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.2]) def setCustomColumnWidths(self, ratios): # 计算总比例 totalRatio = sum(ratios) # 获取窗口宽度 screen = QDesktopWidget().screenGeometry() width = screen.width() - 300 # 根据比例设置每列的宽度 for i, ratio in enumerate(ratios): columnWidth = int(width * (ratio / totalRatio)) self.setColumnWidth(i, columnWidth) class HartTableView(VarTableView): def __init__(self, parent=None): super(HartTableView, self).__init__(parent) def setHeader(self): self.setItemDelegateForColumn(9, HartButtonDelegate(self)) self.setItemDelegateForColumn(8, HartVarModelBox(self)) self.model = HartModel([' ID', '仪器名', '描述', '电流值', '参数1', '参数2','参数3', '参数4', '值类型','操作'], [], table=self) def setupColumnWidths(self): self.header.setSectionResizeMode(QHeaderView.Stretch) class TcRtdTableView(VarTableView): def __init__(self, parent=None): super(TcRtdTableView, self).__init__(parent) self.setItemDelegateForColumn(6, 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 setupColumnWidths(self): self.header.setSectionResizeMode(QHeaderView.Stretch) def setHeader(self): self.setItemDelegateForColumn(11, TcRtdButtonDelegate(self)) self.setItemDelegateForColumn(10, TcRtdVarModelBox(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] * 16 + [0] * 8 + [0] * 8 + [0] * 8 self.realList = [0] * 8 + [0] * 8 + [0] * 16 + [0] * 8 + [0] * 8 + [0] * 8 self.workThread = AnalogThread(self) Globals.setValue('AnalogThread', self.workThread) def setupColumnWidths(self): self.header.setSectionResizeMode(QHeaderView.Stretch) def setHeader(self): self.setItemDelegateForColumn(10, AnalogButtonDelegate(self)) self.setItemDelegateForColumn(9, AnalogVarModelBox(self)) self.model = AnalogModel(['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 setupColumnWidths(self): self.header.setSectionResizeMode(QHeaderView.Stretch) def setHeader(self): self.setItemDelegateForColumn(10, HartSimulateButtonDelegate(self)) self.setItemDelegateForColumn(9, HartSimulateVarModelBox(self)) self.model = HartSimulateModel([' ID', '仪器名', '描述', '主变量', '过程变量1', '过程变量2', '过程变量3', '工程量下限', '工程量上限', '值类型','操作'], [], table=self)