import re import qtawesome from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QStyledItemDelegate, QStyle, QComboBox, QMessageBox, QPushButton,QStackedWidget, QLineEdit, QVBoxLayout, QHBoxLayout, QWidget, QLabel, QSplitter, QButtonGroup from utils.DBModels.DeviceParModels import * from UI.BlockParameterView import ParmView from UI.SearchAddressWidget import SearchAddressWidget from utils.DBModels.DeviceParModels import * from utils import Globals from UI.LoadingDataWidget import LoadingDataWidget from model.ProjectModel.BlockManage import BlockManage, BlockType, TBType class HideTextDelegate(QStyledItemDelegate): def paint(self, painter, option, index): # 仅在下拉列表中绘制文本,避免在ComboBox显示区域绘制 if option.state & QStyle.State_Enabled: super().paint(painter, option, index) def sizeHint(self, option, index): # 返回原始大小,确保下拉列表项不受ComboBox宽度影响 return super().sizeHint(option, index) class TbCombox(QComboBox): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建ComboBox self.addItems(["压力转换块 ", "温度转换块", "物位转换块", "流量转换块"]) self.setEditable(True) # 设置为可编辑以应用样式表隐藏文本 self.setObjectName('tbcombox') # 设置样式隐藏文本 self.lineEdit().setStyleSheet("color: transparent; border:none; background-color: #f0f0f0") self.lineEdit().setCursor(Qt.ArrowCursor) self.lineEdit().setReadOnly(True) # 设置自定义代理以调整下拉列表行为 self.delegate = HideTextDelegate(self) self.setItemDelegate(self.delegate) # 设置ComboBox的固定大小 self.setFixedSize(30, 40) # 确保下拉列表宽度适应最长项 # max_width = max(self.fontMetrics().width(self.itemText(i)) for i in range(self.count())) self.view().setMinimumWidth(100) class DynamicAddBlock(QHBoxLayout): def __init__(self, blocklist): super().__init__() self.blocklist = blocklist self.buttonlist = [] self.blockViewlist = [] self.tbList = ['PressureTranslationBlock', 'TemperatureTranslationBlock', 'LevelTranslationBlock', 'FlowTranslationBlock'] #存放四个转换块 self.enumList = [TBType.pressureTB, TBType.tempTB, TBType.levelTB, TBType.flowTB] self.initUI() def initUI(self): pbNumber = self.blocklist[0] tbNumber = self.blocklist[1] fbNumber = self.blocklist[2] for i in range(pbNumber): pblockBtn = QPushButton('物理块') pblockBtn.setCheckable(True) # pblockBtn.setFixedSize(90, 43) pblockBtn.setObjectName("parameBtn") pblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f')) # pblockBtn.setCheckable(True) pblockBtn.clicked.connect(lambda _, pbbtn = pblockBtn: self.switchParameterWidget(pbbtn)) self.addWidget(pblockBtn, 3) self.buttonlist.append(pblockBtn) physicalBlockView = ParmView(PhysicalBlock, i, BlockType.PB) self.blockViewlist.append(physicalBlockView) if i == 0: pblockBtn.setChecked(True) for i in range(fbNumber): fblockBtn = QPushButton('功能块' + str(i + 1)) # fblockBtn.setFixedSize(90, 43) fblockBtn.setCheckable(True) fblockBtn.setObjectName("parameBtn") fblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f')) fblockBtn.clicked.connect(lambda _, fbbtn = fblockBtn: self.switchParameterWidget(fbbtn)) self.addWidget(fblockBtn, 3) self.buttonlist.append(fblockBtn) aiFunctionBlockView = ParmView(AIFunctionBlock, i, BlockType.FB) self.blockViewlist.append(aiFunctionBlockView) for i in range(tbNumber): tbwidget = QWidget() tbwidget.setObjectName('tbwidget') tblayout = QHBoxLayout() tbwidget.setLayout(tblayout) tbcombox = TbCombox() tbcombox.setCurrentIndex(0) tblockBtn = QPushButton('压力转换块' + str(i + 1)) tblockBtn.setObjectName("tbparameBtn") # tblockBtn.setFixedSize(130, 43) tblockBtn.setCheckable(True) tblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f')) # tblockBtn.clicked.connect(lambda _, tbbtn = tblockBtn: self.switchParameterWidget(tbbtn)) tblockBtn.clicked.connect(lambda _, combox = tbcombox, tbbtn = tblockBtn : self.switchTbtype(combox.currentIndex(), combox, tbbtn)) tbcombox.currentIndexChanged.connect(lambda index, combox = tbcombox, tbbtn = tblockBtn : self.switchTbtype(index, combox, tbbtn)) tblayout.addWidget(tblockBtn, 6) tblayout.addWidget(tbcombox, 1) tblayout.setSpacing(0) self.addWidget(tbwidget, 5) self.buttonlist.append(tblockBtn) for tb, enum in zip(self.tbList, self.enumList): tbBlockView = ParmView(globals()[tb], i, enum) self.blockViewlist.append(tbBlockView) self.parameterButtonGroup = QButtonGroup() self.parameterButtonGroup.setExclusive(True) for button in self.buttonlist: self.parameterButtonGroup.addButton(button) self.parameStackWidget = QStackedWidget() for view in self.blockViewlist: self.parameStackWidget.addWidget(view) def switchParameterWidget(self, buttonType): for index , button in enumerate(self.buttonlist): if button == buttonType: self.parameStackWidget.setCurrentIndex(index) def switchTbtype(self, index, combox, button): tbType = combox.itemText(index) buttonNumber = button.text()[-1:] button.setText(tbType + str(buttonNumber)) if button.isChecked(): stackIndex = (int(self.blocklist[0]) + int(self.blocklist[1]) + index) + (int(buttonNumber) - 1) * 4 self.parameStackWidget.setCurrentIndex(stackIndex) def deleteLater(self): while self.count(): item = self.takeAt(0) widget = item.widget() if widget: widget.deleteLater() layout = item.layout() if layout: layout.deleteLater() if self.parameStackWidget: while self.parameStackWidget.count(): widget = self.parameStackWidget.widget(0) self.parameStackWidget.removeWidget(widget) widget.deleteLater() self.parameStackWidget.deleteLater() super().deleteLater() class BlockParameterManageWidget(QWidget): def __init__(self): super().__init__() self.initUI() self.initUIstat = True def initUI(self): self.mainlayout = QVBoxLayout() self.settingLayout = QHBoxLayout() self.deviceAddressLabel = QLabel('从站地址') self.deviceAddressLabel.setObjectName('deviceAddressLabel') self.deviceAddressEdit = QLineEdit() self.deviceAddressEdit.setObjectName("deviceAddressEdit") self.confirmBtn = QPushButton('确定') self.confirmBtn.setIcon(qtawesome.icon('fa5s.check-circle', color='#1fbb6f')) self.confirmBtn.clicked.connect(self.loadBlackData) self.confirmBtn.setObjectName("parameBtn") self.refershDataBtn = QPushButton('加载数据') self.refershDataBtn.setIcon(qtawesome.icon('fa5s.check-circle', color='#1fbb6f')) self.refershDataBtn.clicked.connect(self.refreshData) self.refershDataBtn.setObjectName("parameBtn") self.deviceAddressSearchBtn = QPushButton('查找') self.deviceAddressSearchBtn.setIcon(qtawesome.icon('fa.search', color='#1fbb6f')) self.deviceAddressSearchBtn.clicked.connect(self.searchAddress) self.deviceAddressSearchBtn.setObjectName("parameBtn") self.settingLayout.addWidget(self.deviceAddressLabel, 1) self.settingLayout.addWidget(self.deviceAddressEdit, 1) self.settingLayout.addWidget(self.confirmBtn, 1) self.settingLayout.addWidget(self.refershDataBtn, 1) self.settingLayout.addWidget(self.deviceAddressSearchBtn, 1) # self.settingLayout.addLayout(self.blockLayout) self.splitter = QSplitter() self.settingLayout.addWidget(self.splitter, 18) self.mainlayout.addLayout(self.settingLayout,1) self.widget = QWidget() self.mainlayout.addWidget(self.widget, 20) self.setLayout(self.mainlayout) def loadBlackData(self): if self.initUIstat: address = self.deviceAddressEdit.text() # print(address) if address: pattern = re.compile(r'^(?:[1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-5])$') match = pattern.match(address) if not match: QMessageBox.warning(self, '提示', '请输入1 - 125。') return if self.initUIstat: self.splitter.deleteLater() self.widget.deleteLater() self.splitter = QSplitter() self.blockManage = BlockManage(int(address)) Globals.setValue('blockManage', self.blockManage) blocklist = self.blockManage.getBlockNums() self.blockLayout = DynamicAddBlock(blocklist) self.settingLayout.addLayout(self.blockLayout, 7) self.settingLayout.addWidget(self.splitter, 11) self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20) self.initUIstat = False else: reply = QMessageBox.question(self.parent(), '警告', "请输入从站地址", QMessageBox.Yes) return else: reply = QMessageBox.question(self, '确定', '确定更换站地址吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: self.blockLayout.deleteLater() self.splitter.deleteLater() self.splitter = QSplitter() blocklist = self.blockManage.getBlockNums() self.blockLayout = DynamicAddBlock(blocklist) self.settingLayout.addLayout(self.blockLayout, 7) self.settingLayout.addWidget(self.splitter, 11) self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20) else: return def refreshData(self): if self.initUIstat: reply = QMessageBox.question(self.parent(), '警告', "请先连接设备", QMessageBox.Yes) return self.loadingDataWidget = LoadingDataWidget() self.loadingDataWidget.show() # self.loadingDataWidget.loadData() blockView = self.blockLayout.parameStackWidget.currentWidget() model = blockView.model # model.updateColumn(5, '查询中sdadadsda\r\nsdasdsasasad\r\nasdsadsad...') # blockView.resizeHeader() blockType = blockView.blockType blcokIndex = blockView.blcokIndex self.blockManage.getBlockValues(blockType = blockType, blockIndex = blcokIndex, callback = self.loadingDataWidget.loadData, callback2 = model.updateValue) # print(valueList) # model.updateValue(valueList) # print(blockType, blcokIndex) def searchAddress(self): self.searchAddressWidget = SearchAddressWidget(self.deviceAddressEdit) self.searchAddressWidget.show()