2016-03-01 10 views
1
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) 

     # why this doesn't work? 
     self.hide() 
     self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool) 

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

Я хочу сделать это только показывать иконку в трее при запуске, пример здесь:Как скрыть окно при запуске, оставив только значок в трее?

Я добавил следующее initUI(), но все же это показывает пустой окно при запуске. Если я минимизирую окно, он будет disppears, оставив только значок в трее, но как я могу сделать это автоматически при запуске?

self.hide() 
    self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool) 

редактировать: Я попробовал этот код на двух разных машинах с Fedora 13 и CentOS 7

+0

Я уже заявил в своем вопросе, что получил этот пример из этой ссылки, которую вы опубликовали. Этот ответ не дает мне результат, который я ищу. Я пробовал каждый ответ под ним, поэтому я задал этот вопрос. – Shuman

+0

Достаточно честный. Я сделал связанный вопрос более очевидным. Возможно, вам также следует указать, на какой платформе вы находитесь. – ekhumoro

ответ

1

Решения является показать-иконки в трее, но скрыть окно. Ваш пример работает для меня в Windows, если я внесут следующие изменения:

def initUI(self): 
     ... 
     self.hide() 
     self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool) 
     # explicitly show the tray-icon 
     self.tray_icon.show()  


def main(): 
    ... 
    ex = Example() 
    # don't re-show the window! 
    # ex.show() 
    sys.exit(app.exec_()) 
0

QWidget::hide() должны делать то, что вы хотите. Проблема в том, что вы вызываете show() в новый экземпляр, который отменяет вызов self.hide() в конструкторе.

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    ex.show() # Remove this line 
    sys.exit(app.exec_()) 
+0

просто попробовал, это не работает. окно не показывалось, но значок в трее не отображается. и, следовательно, нет способа восстановить окно. – Shuman