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.

240 lines
9.1 KiB
Python

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):
super(MainLeft, self).__init__()
self.setupUi()
self.setAttribute(Qt.WA_StyledBackground, True)
def setupUi(self):
# 创建导航按钮
self.createProject = QtWidgets.QPushButton(self)
self.createProject.setObjectName("createProject")
self.varMag = QtWidgets.QPushButton(self)
self.varMag.setObjectName("varMag")
self.trendMag = QtWidgets.QPushButton(self)
self.trendMag.setObjectName("trendMag")
self.userMag = QtWidgets.QPushButton(self)
self.userMag.setObjectName("userMag")
self.protocolMag = QtWidgets.QPushButton(self)
self.protocolMag.setObjectName("protocolMag")
self.procedureMag = QtWidgets.QPushButton(self)
self.procedureMag.setObjectName("procedureMag")
self.controlMag = QtWidgets.QPushButton(self)
self.controlMag.setObjectName("controlMag")
# 创建主布局
self.verticalLayout = QtWidgets.QVBoxLayout(self)
self.verticalLayout.setContentsMargins(16, 24, 16, 24)
self.verticalLayout.setSpacing(6)
self.verticalLayout.setObjectName("verticalLayout")
# 顶部间距
topSpacer = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
self.verticalLayout.addItem(topSpacer)
# 添加导航按钮
self.verticalLayout.addWidget(self.createProject)
self.verticalLayout.addWidget(self.varMag)
self.verticalLayout.addWidget(self.trendMag)
self.verticalLayout.addWidget(self.userMag)
self.verticalLayout.addWidget(self.protocolMag)
self.verticalLayout.addWidget(self.procedureMag)
self.verticalLayout.addWidget(self.controlMag)
# 底部弹性空间
bottomSpacer = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(bottomSpacer)
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.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.Expanding, QSizePolicy.Fixed)
btn.setAttribute(Qt.WA_Hover, True)
btn.installEventFilter(self)
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.setFixedHeight(56)
btn.setStyleSheet("""
QPushButton {
text-align: left;
padding-left: 20px;
border: none;
outline: none;
}
""")
def eventFilter(self, object, event):
# 定义按钮与配置键的映射
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:
if not object.isChecked():
self.setButtonIcon(object, button_key, 'hover')
return True
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):
# 重置所有按钮状态
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')