2009-04-16 58 views
22

有沒有辦法在PyQt4中最小化托盤?我已經使用過QSystemTrayIcon類,但現在我想要最小化或「隱藏」我的應用程序窗口,並只顯示托盤圖標。PyQt4最小化到托盤

有沒有人這樣做?任何方向將不勝感激。

上的Window XP專業版

回答

29

,一旦你記住,有沒有辦法真正減少到system tray這是非常簡單的使用Python 2.5.4和PyQt4的。

相反,你假的做的:

  1. 捕捉你的窗口
  2. 在儘量減少事件在減少事件處理程序,創建並顯示一個QSystemTrayIcon
  3. 另外,在儘量減少事件處理程序,你的窗口上調用隱藏()或調用setVisible(假)
  4. 趕上單擊/雙擊/菜單項上的系統托盤圖標
  5. 在您的系統托盤圖標事件處理程序,調用顯示()或調用setVisible(真)放在窗口上,並可選擇隱藏托盤圖標。
12

代碼幫助,所以這裏是我爲應用程序編寫的東西,除了closeEvent而不是最小化事件。

注:

「的closeEvent(事件)」是一個覆蓋Qt的事件,所以它必須放在實現你想要隱藏的窗口類。

「okayToClose()」是一個您可能考慮實現的函數(或者您可能想要存儲的布爾標誌),因爲有時您實際上想要退出應用程序而不是最小化爲系統托盤。

還有一個如何再次顯示()你的窗口的例子。

def __init__(self): 
    traySignal = "activated(QSystemTrayIcon::ActivationReason)" 
    QtCore.QObject.connect(self.trayIcon, QtCore.SIGNAL(traySignal), self.__icon_activated) 

def closeEvent(self, event): 
    if self.okayToClose(): 
    #user asked for exit 
    self.trayIcon.hide() 
    event.accept() 
    else: 
    #"minimize" 
    self.hide() 
    self.trayIcon.show() #thanks @mojo 
    event.ignore() 

def __icon_activated(self, reason): 
    if reason == QtGui.QSystemTrayIcon.DoubleClick: 
    self.show() 
+0

# 「最小化」 self.hide() self.trayIcon.show() event.ignore() – 2009-05-19 17:00:55

+0

我在系統托盤中的圖標是如何處理的加@魔力的靈活性建議。最初的代碼來自一個應用程序,任務欄圖標總是可見,則self.trayIcon.hide()是如此的圖標沒有堅持圍繞後退出系統托盤(典型的Windows行爲,可悲)。請注意,現在用戶必須實現showEvent(event)方法並調用self.trayIcon.hide()來完成此示例。我應該只是發佈了一個最小化/恢復只是,例如在首位:) – 2009-05-19 18:21:20

7

只是由克里斯添加到示例:

至關重要你聲明的信號時,使用Qt的符號,即

正確

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.iconClicked) 

而不是PyQt之一

不正確,將無法正常工作:

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon.ActivationReason)"), self.iconClicked) 

注意的信號串的::。這花了我大約三個小時才弄清楚。

+0

請embelish上面用>>「至關重要的是,你使用Qt的符號」 <<。在這裏已經有很長一段時間..think小時的思維..做其他事情BYT,直到我看到這篇文章.. == QtCore.SISNAL(「激活(QSystemTrayIcon :: ActivationReason)」)..即沒有理由;-) – PedroMorgan 2011-01-13 04:53:29

+0

DEF create_sys_tray(個體): \t \t self.sysTray = QtGui.QSystemTrayIcon(個體) \t \t self.sysTray.setIcon(QtGui.QIcon( '../圖像/ CORP/blip_32.png')) \t \t self.sysTray.setVisible(真) \t \t self.connect(self.sysTray,QtCore.SIGNAL( 「激活(QSystemTrayIcon :: ActivationReason)」),self.on_sys_tray_activated) \t \t \t \t self.sysTrayMenu = QtGui.QMenu(個體) \t \t ACT = self.sysTrayMenu.addAction( 「FOO」) \t \t \t DEF on_sys_tray_activated(個體,原因): \t \t打印 「reason- =」,原因 – PedroMorgan 2011-01-13 04:58:22

4

這裏的工作code..Thanks Matze關鍵,則SIGNAL花了我更多的時間的好奇..但做其他的事情。所以ta爲#!此刻:-)

def create_sys_tray(self): 
    self.sysTray = QtGui.QSystemTrayIcon(self) 
    self.sysTray.setIcon(QtGui.QIcon('../images/corp/blip_32.png')) 
    self.sysTray.setVisible(True) 
    self.connect(self.sysTray, QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.on_sys_tray_activated) 

    self.sysTrayMenu = QtGui.QMenu(self) 
    act = self.sysTrayMenu.addAction("FOO") 

def on_sys_tray_activated(self, reason): 
    print "reason-=" , reason 
1

這是代碼和它的幫助,我相信我秀的代碼

import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout, QSystemTrayIcon 


class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 
     self.initUI() 

    def initUI(self): 
     self.icon = QSystemTrayIcon() 
     r = self.icon.isSystemTrayAvailable() 
     print r 
     self.icon.setIcon(QtGui.QIcon('/home/vzades/Desktop/web.png')) 
     self.icon.show() 
     # self.icon.setVisible(True) 
     self.setGeometry(300, 300, 250, 150) 
     self.setWindowIcon(QtGui.QIcon('/home/vzades/Desktop/web.png')) 
     self.setWindowTitle('Message box') 
     self.show() 
     self.icon.activated.connect(self.activate) 
     self.show() 

    def closeEvent(self, event): 

     reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes | 
              QtGui.QMessageBox.No, QtGui.QMessageBox.No) 

     if reply == QtGui.QMessageBox.Yes: 
      event.accept() 
     else: 
      self.icon.show() 

      self.hide() 

      event.ignore() 

    def activate(self, reason): 
     print reason 
     if reason == 2: 
      self.show() 

    def __icon_activated(self, reason): 
     if reason == QtGui.QSystemTrayIcon.DoubleClick: 
      self.show() 


def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+2

這段代碼看起來很糟糕。它如何設法獲得選票是無法理解的。 – qed 2014-06-07 15:59:22

3

這是vzades響應的編輯,但卻遭到拒絕的若干理由。它與代碼完全相同,但也會遵守最小化事件(並且運行時沒有語法錯誤/缺少圖標)。

import sys 
from PyQt4 import QtGui, QtCore 


class Example(QtGui.QWidget): 
    def __init__(self): 
     super(Example, self).__init__() 
     self.initUI() 

    def initUI(self): 
     style = self.style() 

     # Set the window and tray icon to something 
     icon = style.standardIcon(QtGui.QStyle.SP_MediaSeekForward) 
     self.tray_icon = QtGui.QSystemTrayIcon() 
     self.tray_icon.setIcon(QtGui.QIcon(icon)) 
     self.setWindowIcon(QtGui.QIcon(icon)) 

     # Restore the window when the tray icon is double clicked. 
     self.tray_icon.activated.connect(self.restore_window) 

    def event(self, event): 
     if (event.type() == QtCore.QEvent.WindowStateChange and 
       self.isMinimized()): 
      # The window is already minimized at this point. AFAIK, 
      # there is no hook stop a minimize event. Instead, 
      # removing the Qt.Tool flag should remove the window 
      # from the taskbar. 
      self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool) 
      self.tray_icon.show() 
      return True 
     else: 
      return super(Example, self).event(event) 

    def closeEvent(self, event): 
     reply = QtGui.QMessageBox.question(
      self, 
      'Message',"Are you sure to quit?", 
      QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, 
      QtGui.QMessageBox.No) 

     if reply == QtGui.QMessageBox.Yes: 
      event.accept() 
     else: 
      self.tray_icon.show() 
      self.hide() 
      event.ignore() 

    def restore_window(self, reason): 
     if reason == QtGui.QSystemTrayIcon.DoubleClick: 
      self.tray_icon.hide() 
      # self.showNormal will restore the window even if it was 
      # minimized. 
      self.showNormal() 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
0

這是處理雙擊PyQt5托盤圖標的正確方法。

def _create_tray(self): 
    self.tray_icon = QSystemTrayIcon(self) 
    self.tray_icon.activated.connect(self.__icon_activated) 

def __icon_activated(self, reason): 
    if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.DoubleClick): 
     pass 
相關問題