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.
PROFIBUS/UI/BlockParameterManageWidget.py

253 lines
10 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
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 = [BlockType.TB.pressureTB, BlockType.TB.tempTB, BlockType.TB.levelTB, BlockType.TB.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)
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):
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.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(QSplitter(), 11)
self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20)
self.initUIstat = False
else:
reply = QMessageBox.question(self.parent(),
'警告',
"请输入从站地址",
QMessageBox.Yes)
return
def refreshData(self):
self.loadingDataWidget = LoadingDataWidget()
self.loadingDataWidget.loadData()
blockView = self.blockLayout.parameStackWidget.currentWidget()
model = blockView.model
model.updateColumn(5, '查询中sdadadsda\r\nsdasdsasasad\r\nasdsadsad...')
blockName = blockView.blockType
blcoknumber = blockView.blcoknumber + 1
print(blockName, blcoknumber)
def searchAddress(self):
self.searchAddressWidget = SearchAddressWidget(self.deviceAddressEdit)
self.searchAddressWidget.show()