|
|
|
|
@ -2,6 +2,7 @@ from PyQt5 import QtCore, QtWidgets
|
|
|
|
|
from PyQt5.QtCore import Qt
|
|
|
|
|
from PyQt5.QtWidgets import QWidget, QSizePolicy
|
|
|
|
|
from PyQt5.QtGui import QIcon
|
|
|
|
|
import qtawesome as qta
|
|
|
|
|
|
|
|
|
|
class MainLeft(QWidget):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
@ -11,12 +12,10 @@ class MainLeft(QWidget):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def setupUi(self):
|
|
|
|
|
# 创建导航按钮
|
|
|
|
|
self.createProject = QtWidgets.QPushButton(self)
|
|
|
|
|
self.createProject.setObjectName("createProject")
|
|
|
|
|
|
|
|
|
|
# self.openProject = QtWidgets.QPushButton(self)
|
|
|
|
|
# self.openProject.setObjectName("openProject")
|
|
|
|
|
|
|
|
|
|
self.varMag = QtWidgets.QPushButton(self)
|
|
|
|
|
self.varMag.setObjectName("varMag")
|
|
|
|
|
|
|
|
|
|
@ -30,162 +29,211 @@ class MainLeft(QWidget):
|
|
|
|
|
self.protocolMag.setObjectName("protocolMag")
|
|
|
|
|
|
|
|
|
|
self.procedureMag = QtWidgets.QPushButton(self)
|
|
|
|
|
self.procedureMag.setObjectName("protocolMag")
|
|
|
|
|
self.procedureMag.setObjectName("procedureMag")
|
|
|
|
|
|
|
|
|
|
self.controlMag = QtWidgets.QPushButton(self)
|
|
|
|
|
self.controlMag.setObjectName("controlMag")
|
|
|
|
|
|
|
|
|
|
# 创建主布局
|
|
|
|
|
self.verticalLayout = QtWidgets.QVBoxLayout(self)
|
|
|
|
|
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
|
|
|
|
self.verticalLayout.setContentsMargins(16, 24, 16, 24)
|
|
|
|
|
self.verticalLayout.setSpacing(6)
|
|
|
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 10, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
|
|
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
# 顶部间距
|
|
|
|
|
topSpacer = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
|
|
|
|
self.verticalLayout.addItem(topSpacer)
|
|
|
|
|
|
|
|
|
|
# 添加导航按钮
|
|
|
|
|
self.verticalLayout.addWidget(self.createProject)
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
# self.verticalLayout.addWidget(self.openProject)
|
|
|
|
|
# self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
self.verticalLayout.addWidget(self.varMag)
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
self.verticalLayout.addWidget(self.trendMag)
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
self.verticalLayout.addWidget(self.userMag)
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
self.verticalLayout.addWidget(self.protocolMag)
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
self.verticalLayout.addWidget(self.procedureMag)
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
self.verticalLayout.addWidget(self.controlMag)
|
|
|
|
|
self.verticalLayout.addWidget(QtWidgets.QSplitter())
|
|
|
|
|
|
|
|
|
|
self.verticalLayout.setStretch(0, 1)
|
|
|
|
|
self.verticalLayout.setStretch(1, 4)
|
|
|
|
|
self.verticalLayout.setStretch(2, 2)
|
|
|
|
|
self.verticalLayout.setStretch(3, 4)
|
|
|
|
|
self.verticalLayout.setStretch(4, 2)
|
|
|
|
|
self.verticalLayout.setStretch(5, 4)
|
|
|
|
|
self.verticalLayout.setStretch(6, 2)
|
|
|
|
|
self.verticalLayout.setStretch(7, 4)
|
|
|
|
|
self.verticalLayout.setStretch(8, 2)
|
|
|
|
|
self.verticalLayout.setStretch(9, 4)
|
|
|
|
|
self.verticalLayout.setStretch(10, 2)
|
|
|
|
|
self.verticalLayout.setStretch(11, 4)
|
|
|
|
|
self.verticalLayout.setStretch(12, 2)
|
|
|
|
|
self.verticalLayout.setStretch(13, 4)
|
|
|
|
|
self.verticalLayout.setStretch(14, 35)
|
|
|
|
|
|
|
|
|
|
QtCore.QMetaObject.connectSlotsByName(self)
|
|
|
|
|
# 底部弹性空间
|
|
|
|
|
bottomSpacer = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
|
|
|
|
self.verticalLayout.addItem(bottomSpacer)
|
|
|
|
|
|
|
|
|
|
self.createProject.setText('工程管理')
|
|
|
|
|
# self.openProject.setText("打开工程")
|
|
|
|
|
self.varMag.setText("变量管理")
|
|
|
|
|
self.trendMag.setText("历史趋势")
|
|
|
|
|
self.userMag.setText("用户管理")
|
|
|
|
|
self.protocolMag.setText("通讯配置")
|
|
|
|
|
self.procedureMag.setText("规程管理")
|
|
|
|
|
self.controlMag.setText("控制系统")
|
|
|
|
|
|
|
|
|
|
self.createProject.setIcon(QIcon('./Static/newH.png'))
|
|
|
|
|
# self.openProject.setIcon(QIcon('./Static/open.png'))
|
|
|
|
|
self.varMag.setIcon(QIcon('./Static/varMag.png'))
|
|
|
|
|
self.trendMag.setIcon(QIcon('./Static/trend.png'))
|
|
|
|
|
self.userMag.setIcon(QIcon('./Static/userMag.png'))
|
|
|
|
|
self.protocolMag.setIcon(QIcon('./Static/setting.png'))
|
|
|
|
|
self.procedureMag.setIcon(QIcon('./Static/procedure.png'))
|
|
|
|
|
self.controlMag.setIcon(QIcon('./Static/control.png'))
|
|
|
|
|
QtCore.QMetaObject.connectSlotsByName(self)
|
|
|
|
|
|
|
|
|
|
# 设置按钮文本
|
|
|
|
|
self.createProject.setText(' 工程管理')
|
|
|
|
|
self.varMag.setText(" 变量管理")
|
|
|
|
|
self.trendMag.setText(" 历史数据")
|
|
|
|
|
self.userMag.setText(" 用户管理")
|
|
|
|
|
self.protocolMag.setText(" 通讯配置")
|
|
|
|
|
self.procedureMag.setText(" 规程管理")
|
|
|
|
|
self.controlMag.setText(" 控制系统")
|
|
|
|
|
|
|
|
|
|
# 定义工业控制风格的图标配置
|
|
|
|
|
self.icon_config = {
|
|
|
|
|
'createProject': {
|
|
|
|
|
'icon': 'fa5s.project-diagram', # 项目图标
|
|
|
|
|
'normal_color': '#6B7280',
|
|
|
|
|
'hover_color': '#2277EF',
|
|
|
|
|
'selected_color': '#FFFFFF'
|
|
|
|
|
},
|
|
|
|
|
'varMag': {
|
|
|
|
|
'icon': 'fa5s.server', # 服务器/变量管理
|
|
|
|
|
'normal_color': '#6B7280',
|
|
|
|
|
'hover_color': '#2277EF',
|
|
|
|
|
'selected_color': '#FFFFFF'
|
|
|
|
|
},
|
|
|
|
|
'trendMag': {
|
|
|
|
|
'icon': 'fa5s.chart-area', # 面积图/历史趋势
|
|
|
|
|
'normal_color': '#6B7280',
|
|
|
|
|
'hover_color': '#2277EF',
|
|
|
|
|
'selected_color': '#FFFFFF'
|
|
|
|
|
},
|
|
|
|
|
'userMag': {
|
|
|
|
|
'icon': 'fa5s.user-shield', # 用户管理/权限
|
|
|
|
|
'normal_color': '#6B7280',
|
|
|
|
|
'hover_color': '#2277EF',
|
|
|
|
|
'selected_color': '#FFFFFF'
|
|
|
|
|
},
|
|
|
|
|
'protocolMag': {
|
|
|
|
|
'icon': 'fa5s.ethernet', # 以太网/通讯协议
|
|
|
|
|
'normal_color': '#6B7280',
|
|
|
|
|
'hover_color': '#2277EF',
|
|
|
|
|
'selected_color': '#FFFFFF'
|
|
|
|
|
},
|
|
|
|
|
'procedureMag': {
|
|
|
|
|
'icon': 'fa5s.clipboard-list', # 清单/规程管理
|
|
|
|
|
'normal_color': '#6B7280',
|
|
|
|
|
'hover_color': '#2277EF',
|
|
|
|
|
'selected_color': '#FFFFFF'
|
|
|
|
|
},
|
|
|
|
|
'controlMag': {
|
|
|
|
|
'icon': 'fa5s.microchip', # 芯片/控制系统
|
|
|
|
|
'normal_color': '#6B7280',
|
|
|
|
|
'hover_color': '#2277EF',
|
|
|
|
|
'selected_color': '#FFFFFF'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 设置初始图标(正常状态)
|
|
|
|
|
self.setButtonIcon(self.createProject, 'createProject', 'normal')
|
|
|
|
|
self.setButtonIcon(self.varMag, 'varMag', 'normal')
|
|
|
|
|
self.setButtonIcon(self.trendMag, 'trendMag', 'normal')
|
|
|
|
|
self.setButtonIcon(self.userMag, 'userMag', 'normal')
|
|
|
|
|
self.setButtonIcon(self.protocolMag, 'protocolMag', 'normal')
|
|
|
|
|
self.setButtonIcon(self.procedureMag, 'procedureMag', 'normal')
|
|
|
|
|
self.setButtonIcon(self.controlMag, 'controlMag', 'normal')
|
|
|
|
|
|
|
|
|
|
# 配置所有按钮
|
|
|
|
|
for btn in [self.createProject, self.varMag, self.trendMag, self.userMag, self.protocolMag, self.procedureMag, self.controlMag]:
|
|
|
|
|
self.setBtn(btn)
|
|
|
|
|
|
|
|
|
|
# self.openProject.clicked.connect(lambda:self.openProject.setIcon(QIcon('./Static/openH.png')))
|
|
|
|
|
self.createProject.clicked.connect(lambda:self.createProject.setIcon(QIcon('./Static/newH.png')))
|
|
|
|
|
self.varMag.clicked.connect(lambda:self.varMag.setIcon(QIcon('./Static/varMagH.png')))
|
|
|
|
|
self.trendMag.clicked.connect(lambda:self.trendMag.setIcon(QIcon('./Static/trendH.png')))
|
|
|
|
|
self.userMag.clicked.connect(lambda:self.userMag.setIcon(QIcon('./Static/userMagH.png')))
|
|
|
|
|
self.protocolMag.clicked.connect(lambda:self.protocolMag.setIcon(QIcon('./Static/settingH.png')))
|
|
|
|
|
self.controlMag.clicked.connect(lambda:self.controlMag.setIcon(QIcon('./Static/controlH.png')))
|
|
|
|
|
# 连接点击事件 - 设置选中时的白色图标
|
|
|
|
|
self.createProject.clicked.connect(lambda: self.setSelectedIcon(self.createProject, 'createProject'))
|
|
|
|
|
self.varMag.clicked.connect(lambda: self.setSelectedIcon(self.varMag, 'varMag'))
|
|
|
|
|
self.trendMag.clicked.connect(lambda: self.setSelectedIcon(self.trendMag, 'trendMag'))
|
|
|
|
|
self.userMag.clicked.connect(lambda: self.setSelectedIcon(self.userMag, 'userMag'))
|
|
|
|
|
self.protocolMag.clicked.connect(lambda: self.setSelectedIcon(self.protocolMag, 'protocolMag'))
|
|
|
|
|
self.procedureMag.clicked.connect(lambda: self.setSelectedIcon(self.procedureMag, 'procedureMag'))
|
|
|
|
|
self.controlMag.clicked.connect(lambda: self.setSelectedIcon(self.controlMag, 'controlMag'))
|
|
|
|
|
|
|
|
|
|
# 设置默认选中状态
|
|
|
|
|
self.createProject.setChecked(True)
|
|
|
|
|
self.createProject.setDown(True)
|
|
|
|
|
self.setSelectedIcon(self.createProject, 'createProject')
|
|
|
|
|
|
|
|
|
|
def setButtonIcon(self, button, button_key, state):
|
|
|
|
|
"""设置按钮图标
|
|
|
|
|
Args:
|
|
|
|
|
button: 按钮对象
|
|
|
|
|
button_key: 按钮配置键
|
|
|
|
|
state: 状态 ('normal', 'hover', 'selected')
|
|
|
|
|
"""
|
|
|
|
|
config = self.icon_config[button_key]
|
|
|
|
|
icon_name = config['icon']
|
|
|
|
|
|
|
|
|
|
if state == 'normal':
|
|
|
|
|
color = config['normal_color']
|
|
|
|
|
elif state == 'hover':
|
|
|
|
|
color = config['hover_color']
|
|
|
|
|
elif state == 'selected':
|
|
|
|
|
color = config['selected_color']
|
|
|
|
|
else:
|
|
|
|
|
color = config['normal_color']
|
|
|
|
|
|
|
|
|
|
# 创建QtAwesome图标
|
|
|
|
|
icon = qta.icon(icon_name, color=color)
|
|
|
|
|
button.setIcon(icon)
|
|
|
|
|
|
|
|
|
|
def setSelectedIcon(self, button, button_key):
|
|
|
|
|
"""设置选中按钮的白色图标"""
|
|
|
|
|
self.setButtonIcon(button, button_key, 'selected')
|
|
|
|
|
|
|
|
|
|
def setBtn(self, btn):
|
|
|
|
|
btn.setCheckable(True)
|
|
|
|
|
btn.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
|
|
|
|
|
btn.setAttribute(Qt.WA_Hover,True)
|
|
|
|
|
btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
|
|
|
|
btn.setAttribute(Qt.WA_Hover, True)
|
|
|
|
|
btn.installEventFilter(self)
|
|
|
|
|
btn.setIconSize(QtCore.QSize(26, 26))
|
|
|
|
|
btn.setIconSize(QtCore.QSize(22, 22))
|
|
|
|
|
btn.clicked.connect(self.clearButton)
|
|
|
|
|
btn.setAutoExclusive(True)
|
|
|
|
|
btn.clicked.connect(lambda:btn.setDown(True))
|
|
|
|
|
btn.clicked.connect(lambda:btn.setChecked(True))
|
|
|
|
|
btn.clicked.connect(lambda: btn.setDown(True))
|
|
|
|
|
btn.clicked.connect(lambda: btn.setChecked(True))
|
|
|
|
|
|
|
|
|
|
# 设置固定高度和样式
|
|
|
|
|
btn.setFixedHeight(56)
|
|
|
|
|
btn.setStyleSheet("""
|
|
|
|
|
QPushButton {
|
|
|
|
|
text-align: left;
|
|
|
|
|
padding-left: 20px;
|
|
|
|
|
border: none;
|
|
|
|
|
outline: none;
|
|
|
|
|
}
|
|
|
|
|
""")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def eventFilter(self, object, event):
|
|
|
|
|
if object == self.createProject:
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverEnter:
|
|
|
|
|
self.createProject.setIcon(QIcon('./Static/newH.png'))
|
|
|
|
|
return True
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverLeave and not self.createProject.isChecked():
|
|
|
|
|
self.createProject.setIcon(QIcon('./Static/new.png'))
|
|
|
|
|
return True
|
|
|
|
|
# if object == self.openProject:
|
|
|
|
|
# if event.type() == QtCore.QEvent.HoverEnter:
|
|
|
|
|
# self.openProject.setIcon(QIcon('./Static/openH.png'))
|
|
|
|
|
# return True
|
|
|
|
|
# if event.type() == QtCore.QEvent.HoverLeave and not self.openProject.isChecked():
|
|
|
|
|
# self.openProject.setIcon(QIcon('./Static/open.png'))
|
|
|
|
|
# return True
|
|
|
|
|
if object == self.varMag:
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverEnter:
|
|
|
|
|
self.varMag.setIcon(QIcon('./Static/varMagH.png'))
|
|
|
|
|
return True
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverLeave and not self.varMag.isChecked():
|
|
|
|
|
self.varMag.setIcon(QIcon('./Static/varMag.png'))
|
|
|
|
|
return True
|
|
|
|
|
if object == self.trendMag:
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverEnter:
|
|
|
|
|
self.trendMag.setIcon(QIcon('./Static/trendH.png'))
|
|
|
|
|
return True
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverLeave and not self.trendMag.isChecked():
|
|
|
|
|
self.trendMag.setIcon(QIcon('./Static/trend.png'))
|
|
|
|
|
return True
|
|
|
|
|
if object == self.userMag:
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverEnter:
|
|
|
|
|
self.userMag.setIcon(QIcon('./Static/userMagH.png'))
|
|
|
|
|
return True
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverLeave and not self.userMag.isChecked():
|
|
|
|
|
self.userMag.setIcon(QIcon('./Static/userMag.png'))
|
|
|
|
|
return True
|
|
|
|
|
if object == self.protocolMag:
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverEnter:
|
|
|
|
|
self.protocolMag.setIcon(QIcon('./Static/settingH.png'))
|
|
|
|
|
return True
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverLeave and not self.protocolMag.isChecked():
|
|
|
|
|
self.protocolMag.setIcon(QIcon('./Static/setting.png'))
|
|
|
|
|
return True
|
|
|
|
|
if object == self.controlMag:
|
|
|
|
|
# 定义按钮与配置键的映射
|
|
|
|
|
button_mapping = {
|
|
|
|
|
self.createProject: 'createProject',
|
|
|
|
|
self.varMag: 'varMag',
|
|
|
|
|
self.trendMag: 'trendMag',
|
|
|
|
|
self.userMag: 'userMag',
|
|
|
|
|
self.protocolMag: 'protocolMag',
|
|
|
|
|
self.procedureMag: 'procedureMag',
|
|
|
|
|
self.controlMag: 'controlMag'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if object in button_mapping:
|
|
|
|
|
button_key = button_mapping[object]
|
|
|
|
|
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverEnter:
|
|
|
|
|
self.controlMag.setIcon(QIcon('./Static/controlH.png'))
|
|
|
|
|
if not object.isChecked():
|
|
|
|
|
self.setButtonIcon(object, button_key, 'hover')
|
|
|
|
|
return True
|
|
|
|
|
if event.type() == QtCore.QEvent.HoverLeave and not self.controlMag.isChecked():
|
|
|
|
|
self.controlMag.setIcon(QIcon('./Static/control.png'))
|
|
|
|
|
|
|
|
|
|
elif event.type() == QtCore.QEvent.HoverLeave:
|
|
|
|
|
if object.isChecked():
|
|
|
|
|
self.setButtonIcon(object, button_key, 'selected')
|
|
|
|
|
else:
|
|
|
|
|
self.setButtonIcon(object, button_key, 'normal')
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def clearButton(self):
|
|
|
|
|
self.createProject.setDown(False)
|
|
|
|
|
# self.openProject.setDown(False)
|
|
|
|
|
self.varMag.setDown(False)
|
|
|
|
|
self.trendMag.setDown(False)
|
|
|
|
|
self.userMag.setDown(False)
|
|
|
|
|
self.protocolMag.setDown(False)
|
|
|
|
|
self.controlMag.setDown(False)
|
|
|
|
|
|
|
|
|
|
self.createProject.setIcon(QIcon('./Static/new.png'))
|
|
|
|
|
# self.openProject.setIcon(QIcon('./Static/open.png'))
|
|
|
|
|
self.varMag.setIcon(QIcon('./Static/varMag.png'))
|
|
|
|
|
self.trendMag.setIcon(QIcon('./Static/trend.png'))
|
|
|
|
|
self.userMag.setIcon(QIcon('./Static/userMag.png'))
|
|
|
|
|
self.protocolMag.setIcon(QIcon('./Static/setting.png'))
|
|
|
|
|
self.controlMag.setIcon(QIcon('./Static/control.png'))
|
|
|
|
|
# 重置所有按钮状态
|
|
|
|
|
buttons = [
|
|
|
|
|
(self.createProject, 'createProject'),
|
|
|
|
|
(self.varMag, 'varMag'),
|
|
|
|
|
(self.trendMag, 'trendMag'),
|
|
|
|
|
(self.userMag, 'userMag'),
|
|
|
|
|
(self.protocolMag, 'protocolMag'),
|
|
|
|
|
(self.procedureMag, 'procedureMag'),
|
|
|
|
|
(self.controlMag, 'controlMag')
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
for button, button_key in buttons:
|
|
|
|
|
button.setDown(False)
|
|
|
|
|
# 重置图标为正常状态
|
|
|
|
|
self.setButtonIcon(button, button_key, 'normal')
|
|
|
|
|
|