Pergunta

Existe uma maneira de minimizar a bandeja em PyQt4? Eu já trabalhei com a classe QSystemTrayIcon, mas agora eu gostaria de minimizar ou janela app "esconder" o meu, e mostrar apenas o ícone da bandeja.

Alguém fez isso? Qualquer direção seria apreciada.

Usando Python 2.5.4 e PyQt4 no Windows XP Pro

Foi útil?

Solução

É bastante simples uma vez que você lembre-se que não há nenhuma maneira de realmente minimizar a sistema de bandeja .

Em vez disso, você finge fazendo isso:

  1. Pegar o evento minimizar em sua janela
  2. No manipulador de eventos minimizar, criar e mostrar uma QSystemTrayIcon
  3. Também no manipulador de eventos, hide call () ou setVisible (false) na sua janela minimizar
  4. Pegar um item de clique / duplo clique / menu no seu sistema bandeja ícone
  5. No seu manipulador de eventos do sistema ícone da bandeja, chamada show () ou setVisible (true) em sua janela, e, opcionalmente, ocultar seu ícone da bandeja.

Outras dicas

Código ajuda, assim que algo está aqui eu escrevi para um aplicativo, exceto para o CloseEvent em vez do evento minimizar.

Notas:

"CloseEvent (evento)" é um evento Qt substituído, por isso deve ser colocado na classe que implementa a janela que você deseja esconder.

"okayToClose ()" é uma função que você pode considerar a implementação (ou um sinalizador booleano que você pode querer loja) desde às vezes você realmente deseja sair do aplicativo em vez de minimizar a bandeja do sistema.

Há também um exemplo de como mostrar () sua janela novamente.

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

Apenas para adicionar ao exemplo por Chris:

É crucial que você use a notação Qt ao declarar o sinal, i.

correta :

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

e não o PyQt um

incorreta e não vai funcionar:

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

Observe o :: na cadeia de sinal. Isso me levou cerca de três horas para descobrir.

code..Thanks Aqui está trabalhando Matze cruciais , o sinal levou-me mais horas de curiosidade .. mas fazendo outras coisas. assim ta para um #! momento: -)

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

Esta foi uma edição de resposta vzades, mas foi rejeitada em uma série de motivos. Ele faz exatamente a mesma coisa como seu código, mas também obedecerá o evento minimizar (e executado sem erros de sintaxe / ícones em falta).

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

Esta é a maneira correta de lidar com um duplo clique em um ícone de bandeja para 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

Este é o código e ele não ajuda eu acredito no show me o código

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top