2014-05-07 34 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