from PyQt5 import QtCore from PyQt5.QtGui import QTextDocument from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QHeaderView, QAbstractItemView, QTableView, QWidget, QDesktopWidget from UI.BlockParameterModel import VarTableModel, VarButtonDelegate, ComboBoxDelegate from utils.DBModels.DeviceParModels import * class ParamsVHeader(QHeaderView): def __init__(self, parent, datas): super().__init__(Qt.Vertical, parent) self.datas = datas def resizeEvent(self, event): """Resize table as a whole, need this to enable resizing""" super(QHeaderView, self).resizeEvent(event) for index, content in enumerate(self.datas): self.setSectionResizeMode(index, QHeaderView.Fixed) self.resizeSection(index, 50 * (content[2].count('\r\n') + 1)) return class VarTableView(QTableView): def __init__(self, parent=None): super(VarTableView, self).__init__(parent) self.parent = parent self.setHeader() self.setupUi() def setHeader(self): self.setItemDelegateForColumn(6, VarButtonDelegate(self)) self.setItemDelegateForColumn(5, ComboBoxDelegate(self)) self.model = VarTableModel(['相对索引', '参数名', '描述', '数据类型', '访问', '当前值', '输入值'], [], table = self) def setupUi(self): self.setShowGrid(True) self.setAlternatingRowColors(True) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setObjectName('BlockView') #设置单元格宽度比例 self.header = self.horizontalHeader() self.header.setSectionResizeMode(QHeaderView.Interactive) self.header.setStretchLastSection(True) self.proxy = QtCore.QSortFilterProxyModel(self) # # self.parameTableView.proxy = self.proxy self.proxy.setSourceModel(self.model) self.setModel(self.proxy) self.setCustomColumnWidths([1, 3, 9, 2, 2, 2, 2]) # 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) def setCustomColumnWidths(self, ratios): # 计算总比例 totalRatio = sum(ratios) # 获取窗口宽度 screen = QDesktopWidget().screenGeometry() width = screen.width() - 80 # 根据比例设置每列的宽度 for i, ratio in enumerate(ratios): columnWidth = int(width * (ratio / totalRatio)) self.setColumnWidth(i, columnWidth) class PressureTBlockView(VarTableView): def __init__(self, datas = None): super().__init__() self.datas = datas self.initUI() def initUI(self): if not self.datas: self.datas = PressureTranslationBlock.getallParame() for index, data in enumerate(self.datas): desc = data[2].replace('\r\n', '').replace('\n', '') lines = [desc[i:i+50] + "\r\n" for i in range(0, len(desc), 50)] # 合并列表为一个字符串,移除最后一个换行符 result = "".join(lines).rstrip("\r\n") data[2] = result data = data + ['', '', ''] self.model.append_data(data) self.setVerticalHeader(ParamsVHeader(self, self.model.datas)) class AIFunctionBlockView(PressureTBlockView): def __init__(self): self.datas = AIFunctionBlock.getallParame() super().__init__(self.datas) class PhysicalBlockView(PressureTBlockView): def __init__(self): self.datas = PhysicalBlock.getallParame() super().__init__(self.datas)