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.

183 lines
7.3 KiB
Python

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)