PyQt4 au bac Réduire au minimum
-
09-09-2019 - |
Question
Y at-il un moyen de réduire dans la barre en PyQt4? Je l'ai déjà travaillé avec la classe QSystemTrayIcon, mais maintenant je voudrais minimiser ou « cacher » ma fenêtre d'application, et de montrer que l'icône de la barre.
Quelqu'un at-il fait cela? Toute direction serait appréciée.
En utilisant Python 2.5.4 et PyQt4 sur Windows XP Pro
La solution
Il est assez simple une fois que vous vous souvenez qu'il n'y a aucun moyen de minimiser effectivement la barre d'état système .
Au lieu de cela, vous truquer en faisant ceci:
- Attrapez l'événement minimiser votre fenêtre
- Dans le gestionnaire d'événements minimiser, créer et afficher un QSystemTrayIcon
- Toujours dans le gestionnaire d'événements minimiser, cacher des appels () ou setVisible (false) sur la fenêtre
- Catch un clic / double-cliquez sur / élément de menu sur l'icône de la barre système
- Dans votre gestionnaire d'événements icône de la barre système, émission d'appels () ou setVisible (true) sur la fenêtre, et éventuellement masquer votre icône de la barre.
Autres conseils
code aide, alors voici quelque chose que j'ai écrit pour une application, à l'exception du closeEvent au lieu de l'événement minimiser.
Notes:
« closeEvent (événement) » est un événement Qt substituée, il doit être mis dans la classe qui implémente la fenêtre que vous voulez cacher.
« okayToClose () » est une fonction que vous pourriez envisager d'appliquer (ou un drapeau booléen vous pouvez stocker) car parfois vous voulez vraiment quitter l'application au lieu de minimiser au systray.
Il y a aussi un exemple de la façon de montrer () votre fenêtre.
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()
Il suffit d'ajouter à l'exemple de Chris:
Il est essentiel que vous utilisez la notation Qt lors de la déclaration du signal, i.e..
correcte :
self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.iconClicked)
et non le PyQt un
incorrect et ne fonctionnera pas:
self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon.ActivationReason)"), self.iconClicked)
Notez la ::
dans la chaîne de signal. Cela m'a pris environ trois heures pour comprendre.
Voici qui marche code..Thanks Matze Crucial , le signal m'a pris plus d'heures de curiosité .. mais faire d'autres choses. si ta un #! instant: -)
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
Ce fut une modification de la réponse de vzades, mais elle a été rejetée sur un certain nombre de motifs. Il fait exactement la même chose que leur code mais aussi obéir à l'événement réduisent au minimum (et exécuter sans erreurs de syntaxe / icônes manquantes).
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()
Ceci est la bonne façon de gérer un double clic sur une icône de la barre pour 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
Ceci est le code et il ne me aide, je crois en visualisera le code
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()