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

7 months ago
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
7 months ago
class MainLeft(QWidget):
def __init__(self):
super(MainLeft, self).__init__()
self.setupUi()
self.setAttribute(Qt.WA_StyledBackground, True)
def setupUi(self):
# 创建导航按钮
7 months ago
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")
4 months ago
self.procedureMag = QtWidgets.QPushButton(self)
self.procedureMag.setObjectName("procedureMag")
7 months ago
self.controlMag = QtWidgets.QPushButton(self)
self.controlMag.setObjectName("controlMag")
# 创建主布局
7 months ago
self.verticalLayout = QtWidgets.QVBoxLayout(self)
self.verticalLayout.setContentsMargins(16, 24, 16, 24)
self.verticalLayout.setSpacing(6)
7 months ago
self.verticalLayout.setObjectName("verticalLayout")
# 顶部间距
topSpacer = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
self.verticalLayout.addItem(topSpacer)
# 添加导航按钮
7 months ago
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)
4 months ago
self.verticalLayout.addWidget(self.procedureMag)
self.verticalLayout.addWidget(self.controlMag)
7 months ago
# 底部弹性空间
bottomSpacer = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(bottomSpacer)
7 months ago
QtCore.QMetaObject.connectSlotsByName(self)
7 months ago
# 设置按钮文本
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]:
7 months ago
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'))
7 months ago
# 设置默认选中状态
7 months ago
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')
7 months ago
def setBtn(self, btn):
btn.setCheckable(True)
btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
btn.setAttribute(Qt.WA_Hover, True)
7 months ago
btn.installEventFilter(self)
btn.setIconSize(QtCore.QSize(22, 22))
7 months ago
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;
}
""")
7 months ago
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
7 months ago
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')