2014-05-07 27 views
1

我试图在成功登录后启动系统托盘菜单。我有2 QtUi屏幕​​,其余的只是Python代码。首先登录对话框,我想在登录后隐藏这个对话框并显示系统托盘菜单。这是我到目前为止的代码:PyQt4在登录后立即启动系统托盘图标

注:UI_Login是QtDesigner

对话框

1.系统托盘UI

from PyQt4 import QtGui 

class SystemTrayIcon(QtGui.QSystemTrayIcon): 

    def __init__(self, icon, parent=None): 
     QtGui.QSystemTrayIcon.__init__(self, parent) 
     menu = QtGui.QMenu(parent)   
     self.exitAction = menu.addAction("Exit") 
     self.helpAction = menu.addAction("Help") 
     self.setIcon(icon) 
     self.setContextMenu(menu) 

2.登录功能。调用为SystemTrayIcon

import sys 
from PyQt4 import QtGui, QtCore 
from modules.ui.login_ui import Ui_Login 
from modules.ui.menu_ui import SystemTrayIcon 
from api.auth import doLogin 

class Login(QtGui.QDialog): 
    """ 
    Login user via the api 
    Links the gui and the app functionality 
    Logged user token is saved for further processing 
    """ 
    def __init__(self, parent = None): 
     QtGui.QDialog.__init__(self, parent) 
     self.ui = Ui_Login() 
     self.ui.setupUi(self) 
     self.ui.pushButton.clicked.connect(self.doLogin) 

    def doLogin(self): 
     self.password = unicode(self.ui.password.text()) 
     self.email = unicode(self.ui.email.text())  
     request_data = {"username": ""+self.email+"", "password": ""+self.password+""} 
     response = doLogin(request_data) 

     if response.status_code == 200: 
      """ 
       1. Save Api token for future entries 
       2. Start app. i.e create a system tray app. 
      """ 
      self.token = response.json()['token']; 

      self.hide() 
      trayIcon = SystemTrayIcon(QtGui.QIcon("Bomb.xpm")) 
      trayIcon.show() 
      print "End check" 
     else: 
      #Raise error 
      print response.json() 

3.主文件

import sys 
from PyQt4 import QtGui, QtCore 
from modules.login import Login 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    login = Login() 
    login.show() 
    sys.exit(app.exec_()) 


if __name__ == "__main__": 
    main() 

问题 - 系统托盘图标没有显示出来,当登录对话框关闭。

您的意见非常感谢。

回答

1

trayIcon对象是一个局部变量,一旦doLogin()方法完成,立即获取垃圾回收。将它作为一个实例属性存储(例如self.trayIcon)将会停止它并且你的图标应该保持存在。

+0

谢谢,保存了我的一天,这让我了解如何处理其他屏幕过渡。 非常感谢 –

0

QSystemTrayIcon有一个activated信号,你可以发出。将此信号连接到将创建一个QMenu的某种方法。

class SystemTrayIcon(QtGui.QSystemTrayIcon): 
    def __init__(self, icon, parent=None): 
     ... 
     self.setContextMenu(menu) 
     self.activated.connect(lambda reason: self._create_menu) 

    def _create_menu(self): 
     menu = QtWidgets.QMenu() 
     menu.addAction(QtWidgets.QAction('Quit,None)) 
     self.setContextMenu(menu) 

接下来,您需要发出activated信号,以便您的菜单显示。我有一个类似的用例,回答了here