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')