2013-04-16 10 views
5

Ich bin eine Qt-Anwendung zu entwickeln und das Schließverhalten der closeEvent virtual function auf diese Weise geändert:Wie kann man das Ereignisverhalten in PyQt oder PySide minimieren?

class MainWindow(QMainWindow): 
    def closeEvent(self, event): 
      event.ignore() 
      self.hide() 
      self.trayicon.showMessage('Running', 'Running in the background.') 

Dies funktioniert wie erwartet. Wenn ich event.ignore() entferne die Anwendung wie erwartet beendet, ist alles in Ordnung.

Ich möchte auch das minimize-Ereignis steuern, also wenn der Benutzer auf die Minimieren-Schaltfläche in der Titelleiste klickt, möchte ich das Fenster verschieben, anstatt zu minimieren. Ich kann die hideEvent virtuelle Funktion, verwenden, da das Ereignis an das Fenster trotzdem gesendet werden, so dass dieser Code:

def hideEvent(self, event): 
    event.ignore() 
    self.move(0,0) 

bewegt sich das Fenster nach oben links und dann minimieren. event.ignore() hat keinen Einfluss hier, also habe ich versucht QtCore.QObject.event auf diese Weise mit:

def event(self, event): 
    if event.type() == QEvent.WindowStateChange: 
     if self.isMinimized(): 
      event.ignore() 
      self.move(0,0) 
      return True 
    return False 

Das Fenster bewegt sich aber minimiert wieder. Was ist daran falsch? Wie kann ich das minimize-Ereignis vollständig überschreiben?

Antwort

5

Versuchen Sie, die changeEvent und Filter für WindowMinimized Ereignisse, etwa wie folgt:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtGui, QtCore 

class MyWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.systemTrayIcon = QtGui.QSystemTrayIcon(self) 
     self.systemTrayIcon.setIcon(QtGui.QIcon.fromTheme("face-smile")) 
     self.systemTrayIcon.setVisible(True) 
     self.systemTrayIcon.activated.connect(self.on_systemTrayIcon_activated) 

     self.label = QtGui.QLabel(self) 
     self.label.setText("Minimize me!") 

     self.layoutVertical = QtGui.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.label) 

    @QtCore.pyqtSlot(QtGui.QSystemTrayIcon.ActivationReason) 
    def on_systemTrayIcon_activated(self, reason): 
     if reason == QtGui.QSystemTrayIcon.DoubleClick: 
      if self.isHidden(): 
       self.show() 

      else: 
       self.hide() 

    def changeEvent(self, event): 
     if event.type() == QtCore.QEvent.WindowStateChange: 
      if self.windowState() & QtCore.Qt.WindowMinimized: 
       event.ignore() 
       self.close() 
       return 

     super(MyWindow, self).changeEvent(event) 

    def closeEvent(self, event): 
     event.ignore() 
     self.hide() 
     self.systemTrayIcon.showMessage('Running', 'Running in the background.') 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.show() 

    sys.exit(app.exec_()) 
+0

Wenn ich dies ausführen, wird der Fenstertitel in der Taskleiste bleibt. Wenn ich darauf klicke, wird das MyWindow grau und leer sein. seltsam. Wenn ich 'self.hide()' in self.move() ändere, findet die Minimierung nach dem Verschieben immer noch statt. :( – kissgyorgy

+0

@Walkman Checkout meine [aktualisierte Antwort] (http://Stackoverflow.com/a/16048802/1006989), habe ich es aktualisiert, um das Verhalten auf das Ereignis minimize –

+0

gleichen Effekt, seltsames Verhalten zu ändern. Titelleiste bleibt auf Windows Taskleiste, und wenn ich versuche, "self.move (0,0)" es bewegt sich UND minimiert wieder. Ich aktualisierte meine Frage, vielleicht ist es klarer, was ich will. – kissgyorgy