PyQt5 创建系统托盘
#创建菜单
minimizeAction = QAction("&最小化(Min)", frmMain, triggered=frmMain.hide)
restoreAction = QAction("&显示(Show)", frmMain, triggered=frmMain.showNormal)
frmMain.trayIconMenu = QMenu(frmMain) #创建菜单
frmMain.trayIconMenu.addAction(minimizeAction)
frmMain.trayIconMenu.addAction(restoreAction)
#创建图标
frmMain.trayIcon = QSystemTrayIcon(frmMain) #创建图标
frmMain.trayIcon.setIcon(QIcon(":/icons/trayIcon.ico")) #设置图标Icon
# 创建菜单操作接口
def trayIcon(frame, frameTrayIcon, frameTrayIconMenu, action='show'):
def exit():
print('get into frmMain().exit()')
# 点击关闭按钮或者点击退出事件会出现图标无法消失的bug,需要手动将图标内存清除
if action == 'close':
frame.close() # 关闭登陆界面
frameTrayIcon.trayIconMenu = None
frameTrayIcon.setVisible(False)
else:
reply = QMessageBox.warning(frame, '警告', '您是否退出程序?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
print('reply: %s' % reply)
frame.close()
frame.trayIconMenu = None
frame.trayIcon.setVisible(False)
app.exit()
if action == 'close':
exit()
else:
quitAction = QAction("&退出(Exit)", frame, triggered=exit)
frameTrayIconMenu.addAction(quitAction)
frameTrayIcon.setContextMenu(frameTrayIconMenu)
frameTrayIcon.show()
def act(reason):
# 鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击
print('get into act(), reason: %s' % reason)
if reason == 2 or reason == 3:
frame.showNormal()
print("系统托盘的图标被点击了")
frameTrayIcon.activated.connect(act)
def message():
print("弹出的信息被点击了")
frameTrayIcon.messageClicked.connect(message)
#系统托盘使用
创建图标
trayIcon(frmMain, frmMain.trayIcon, frmMain.trayIconMenu, action='show')
关闭图标
trayIcon(self, self.trayIcon, self.trayIconMenu, action='close')
附:
class frmLogin(QtWidgets.QWidget, ui_login.Ui_DialogLogin):
def __init__(self):
...
minimizeAction = QAction("&最小化(Min)", self, triggered=self.hide)
restoreAction = QAction("&显示(Show)", self, triggered=self.showNormal)
# quitAction = QAction("&退出(Exit)", self, triggered=self.exit)
self.trayIconMenu = QMenu(self)
self.trayIconMenu.addAction(minimizeAction)
self.trayIconMenu.addAction(restoreAction)
# self.trayIconMenu.addSeparator()
# self.trayIconMenu.addAction(quitAction)
self.trayIcon = QSystemTrayIcon(self)
self.trayIcon.setIcon(QIcon(":/icons/trayIcon.ico"))
# self.trayIcon.setContextMenu(self.trayIconMenu)
# self.trayIcon.show()
trayIcon(self, self.trayIcon, self.trayIconMenu, action='show')
@QtCore.pyqtSlot()
def on_btnlogin_clicked(self):
'''登陆成功后'''
'''创建托盘图标'''
minimizeAction = QAction("&最小化(Min)", frmMain, triggered=frmMain.hide)
restoreAction = QAction("&显示(Show)", frmMain, triggered=frmMain.showNormal)
frmMain.trayIconMenu = QMenu(frmMain)
frmMain.trayIconMenu.addAction(minimizeAction)
frmMain.trayIconMenu.addAction(restoreAction)
frmMain.trayIcon = QSystemTrayIcon(frmMain)
frmMain.trayIcon.setIcon(QIcon(":/icons/trayIcon.ico"))
# self.trayIcon.setContextMenu(self.trayIconMenu)
# self.trayIcon.show()
'''关闭 登陆时的托盘图标'''
trayIcon(self, self.trayIcon, self.trayIconMenu, action='close')
'''创建 登陆时的托盘图标'''
trayIcon(frmMain, frmMain.trayIcon, frmMain.trayIconMenu, action='show')
'''创建图标操作'''
def trayIcon(frame, frameTrayIcon, frameTrayIconMenu, action='show'):
def exit():
print('get into frmMain().exit()')
# 点击关闭按钮或者点击退出事件会出现图标无法消失的bug,需要手动将图标内存清除
# self.trayIconMenu = None
# sys.exit(app.exec_())
if action == 'close':
frame.close() # 关闭登陆界面
frameTrayIcon.trayIconMenu = None
frameTrayIcon.setVisible(False)
else:
reply = QMessageBox.warning(frame, '警告', '您是否退出程序?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
print('reply: %s' % reply)
# app.exit()
frame.close()
frame.trayIconMenu = None
frame.trayIcon.setVisible(False)
if action == 'close':
exit()
else:
quitAction = QAction("&退出(Exit)", frame, triggered=exit)
frameTrayIconMenu.addAction(quitAction)
frameTrayIcon.setContextMenu(frameTrayIconMenu)
frameTrayIcon.show()
def act(reason):
# 鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击
print('get into act(), reason: %s' % reason)
if reason == 2 or reason == 3:
frame.showNormal()
print("系统托盘的图标被点击了")
frameTrayIcon.activated.connect(act)
def message():
print("弹出的信息被点击了")
frameTrayIcon.messageClicked.connect(message)