# -*- coding:utf-8 -*- # Author: Suummmmer # Date: 2019-10-24 import sys import datetime from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMessageBox, qApp from PyQt5.QtGui import QIcon from PyQt5.QtCore import ( QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg ) class SystemTray(object): # 程序托盘类 def __init__(self, w, app): self.app = app self.w = w QApplication.setQuitOnLastWindowClosed(False) # 禁止默认的closed方法, self.w.show() # 不设置显示则为启动最小化到托盘 self.tp = QSystemTrayIcon(self.w) self.initUI() self.run() # sys.stdout = EmittingStream(textWritten=self.w.output_ter_result) # sys.stderr = EmittingStream(textWritten=self.w.output_ter_result) def initUI(self): # 设置托盘图标 self.tp.setIcon(QIcon('/etc/v2rayL/images/logo.ico')) def quitApp(self): # 退出程序 self.w.show() # w.hide() #设置退出时是否显示主窗口 re = QMessageBox.question(self.w, "提示", "确认退出?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if re == QMessageBox.Yes: self.tp.setVisible(False) # 隐藏托盘控件 qApp.quit() # 退出程序 self.w.v2rayL.disconnect() def act(self, reason): # 主界面显示方法 if reason == 2 or reason == 3: self.w.show() def run(self): self.w.a2.triggered.connect(self.quitApp) self.tp.setContextMenu(self.w.tpMenu) self.tp.show() # 不调用show不会显示系统托盘消息,图标隐藏无法调用 # 绑定提醒信息点击事件 # self.tp.messageClicked.connect(self.message) # 绑定托盘菜单点击事件 self.tp.activated.connect(self.act) sys.exit(self.app.exec_()) # 持续对app的连接 def qt_message_handler(mode, context, message): if mode == QtInfoMsg: mode = 'INFO' elif mode == QtWarningMsg: mode = 'WARNING' elif mode == QtCriticalMsg: mode = 'CRITICAL' elif mode == QtFatalMsg: mode = 'FATAL' else: mode = 'DEBUG' msg = message.split("@$ff$@") if len(msg) == 2 and msg[0] == "True": with open("/etc/v2rayL/v2rayL_op.log", "a+") as f: f.write(' %s - %s: %s\n' % (datetime.datetime.now(), mode, msg[1]))