2009-04-16 7 views
22

क्या PyQt4 में ट्रे को कम करने का कोई तरीका है? मैंने पहले से ही QSystemTrayIcon क्लास के साथ काम किया है, लेकिन अब मैं अपनी ऐप विंडो को कम या "छुपा" करना चाहता हूं, और केवल ट्रे आइकन दिखाऊंगा।PyQt4 ट्रे को कम करें

क्या किसी ने ऐसा किया है? किसी भी दिशा की सराहना की जाएगी।

Window XP प्रो

उत्तर

29

एक बार तुम्हें याद कोई रास्ता नहीं वास्तव में system tray को कम करने के लिए बनाया जा सकता है यह बहुत सीधा है पर अजगर 2.5.4 और PyQt4 का उपयोग करना।

इसके बजाय, आप नकली यह ऐसा करके:

  1. पकड़ने अपनी खिड़की
  2. पर घटना को कम से कम कम से कम ईवेंट हैंडलर में, बना सकते हैं और एक QSystemTrayIcon
  3. इसके अलावा कम से कम ईवेंट हैंडलर में दिखाने के लिए, अपनी विंडो पर कॉल छुपाएं() या सेट दृश्यमान (झूठा)
  4. अपने सिस्टम ट्रे आइकन पर एक क्लिक/डबल-क्लिक/मेनू आइटम पकड़ें
  5. अपने सिस्टम ट्रे आइकन ईवेंट हैंडलर में, कॉल शो() या सेट विज़िबल (सत्य) अपनी खिड़की पर, और वैकल्पिक रूप से अपने ट्रे आइकन छुपाएं।
12

कोड मदद करता है, इसलिए यहां कुछ ऐसा है जो मैंने एप्लिकेशन के लिए लिखा था, कम से कम घटना के बजाय closeEvent को छोड़कर।

नोट्स:

"closeEvent (घटना)" एक ओवरराइड क्यूटी घटना है, इसलिए यह वर्ग उस खिड़की छिपाए जाने को लागू करता है में डाल दिया जाना चाहिए।

"ठीक हैक्लोस()" एक ऐसा फ़ंक्शन है जिसे आप कार्यान्वित करने पर विचार कर सकते हैं (या एक बुलियन ध्वज जिसे आप स्टोर करना चाहते हैं) क्योंकि कभी-कभी आप वास्तव में सिस्ट्रे को कम करने के बजाय एप्लिकेशन से बाहर निकलना चाहते हैं।

आपकी खिड़की को फिर से दिखाने के लिए एक उदाहरण भी है।

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() –

+0

मैं कैसे सिस्टम ट्रे आइकन नियंत्रित किया जाता है में @ लचीलेपन के लिए मोजो के सुझाव गयी। मूल कोड उस एप्लिकेशन से आया था जहां ट्रे आइकन हमेशा दिखाई देता था, self.trayIcon.hide() ऐसा था कि आइकन बाहर निकलने के बाद सिस्टम ट्रे पर चिपकने वाला नहीं था (सामान्य विंडोज व्यवहार, दुख की बात है)। ध्यान दें कि अब उपयोगकर्ता को showEvent (event) विधि को लागू करना होगा और इस उदाहरण को पूरा करने के लिए self.trayIcon.hide() को कॉल करना होगा। मुझे बस पहले स्थान पर एक न्यूनतम/पुनर्स्थापना-उदाहरण पोस्ट करना चाहिए था :) –

7

बस क्रिस द्वारा उदाहरण में जोड़ने के लिए:

यह महत्वपूर्ण है है कि आप जब सिग्नल की घोषणा क्यूटी संकेतन का उपयोग, यानी

सही:

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

और पीईक्यूटी नहीं

गलत और काम नहीं करेगा:

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

नोट संकेत स्ट्रिंग में ::। यह पता लगाने के लिए मुझे लगभग तीन घंटे लगे।

+0

कृपया ऊपर दिए गए >> "क्रुसील कि आपका उपयोग क्यूटी नोटेशन" <<। यहाँ बहुत समय से रहा है .. सोचने के घंटों के समय .. जब तक मैं इस पोस्ट को पढ़ नहीं लेता तब तक अन्य चीजें कर रहा हूं .. == क्यूटीकोर। एसआईएसएनएएल ("सक्रिय (QSystemTrayIcon :: ActivationReason)") यानी कोई कारण नहीं ;-) – PedroMorgan

+0

डीईएफ़ create_sys_tray (स्वयं): \t \t self.sysTray = QtGui.QSystemTrayIcon (स्वयं) \t \t self.sysTray.setIcon (QtGui.QIcon ('../ छवियों/कॉर्प/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 अधिनियम = self.sysTrayMenu.addAction ("foo") \t \t \t डीईएफ़ on_sys_tray_activated (स्वयं, कारण): \t \t प्रिंट "कारण है =", कारण – PedroMorgan

4

यहाँ काम कर रहा है code..Thanks Matzeमहत्वपूर्ण के लिए, सिग्नल मुझे जिज्ञासा से अधिक घंटे लगे .. लेकिन अन्य कार्य कर। तो एक # के लिए टा!पल :-)

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

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

लॉन्च करने के बाद मैं इसे केवल ट्रे आइकन कैसे दिखा सकता हूं? अगर मैं setWindowFlags लाइन को initUI() पर ले जाता हूं, तो इसका कोई प्रभाव नहीं पड़ता है, सामान्य विंडो अभी भी – Shuman

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 
+0

दिखाती है, मुझे समझ में आता है कि यह सीधे सवाल का जवाब नहीं देता है, लेकिन इस प्रश्न में बहुत सारे विचार हैं और Google के लोग और अधिक ढूंढ रहे हैं अद्यतित उत्तर। – Veehmot