2013-04-16 4 views
5

che sto sviluppando un'applicazione Qt e ha cambiato il comportamento di chiusura con il closeEvent virtual function in questo modo:Come modificare il comportamento dell'evento minimizzato in PyQt o PySide?

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

Questo funziona come previsto. Se rimuovo event.ignore() l'applicazione si chiude come previsto, tutto va bene.

Voglio controllare anche l'evento di minimizzazione, quindi quando l'utente fa clic sul pulsante di riduzione a icona sulla barra del titolo, voglio spostare la finestra anziché ridurre a icona. non posso utilizzare la funzione virtuale hideEvent, perché l'evento verrà inviato alla finestra comunque, quindi questo codice:

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

sposta la finestra in alto a sinistra e poi ridurlo. event.ignore() non ha alcun effetto qui, quindi ho provato ad utilizzare QtCore.QObject.event questo modo:

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

La finestra si muove, ma minimizza nuovo. Cosa c'è di sbagliato in questo? Come posso ignorare completamente l'evento di minimizzazione?

risposta

5

provare il changeEvent e filtro per WindowMinimized eventi, qualcosa di simile:

#!/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

Se corro questo, il titolo della finestra rimane sulla barra delle applicazioni. Quando faccio clic su quello MyWindow sarà grigio e vuoto. strano. Se cambio 'self.hide()' a self.move(), la minimizzazione continua anche dopo lo spostamento. :( – kissgyorgy

+0

@Walkman Checkout my [risposta aggiornata] (http://stackoverflow.com/a/16048802/1006989), l'ho aggiornato per modificare il comportamento sull'evento minimizzato –

+0

stesso effetto, comportamento strano. barra delle applicazioni, e quando provo a 'self.move (0,0)' si sposta E minimizza di nuovo.Ho aggiornato la mia domanda, forse è più chiaro quello che voglio. – kissgyorgy