Come faccio a prendere un pyqt closeEvent e ridurre la finestra di dialogo invece di uscire?

Ho un QDialog oggetto. Quando l’utente fa clic sul X pulsante o presse Ctrl+Q, voglio la finestra per andare a una icona nella barra di sistema, invece di chiudere. Come faccio a fare che?

  • Basta reimplementare il closeEvent(event) metodo in una sottoclasse e ridurre la finestra di dialogo invece di accettare l’evento. O vuoi dire qualcosa di diverso?
  • OK, ma puoi farmi qualche esempio di codice? Ho provato a fare qualcosa del genere, ma il mio programma è ancora in corso di chiudere!
InformationsquelleAutor Shahinism | 2012-09-11

 

One Reply
  1. 16

    Un semplice sottoclasse che riduce al minimo invece di chiudere è il seguente:

    class MyDialog(QtGui.QDialog):
        # ...
        def __init__(self, parent=None):
            super(MyDialog, self).__init__(parent)
    
            # when you want to destroy the dialog set this to True
            self._want_to_close = False
    
        def closeEvent(self, evnt):
            if self._want_to_close:
                super(MyDialog, self).closeEvent(evnt)
            else:
                evnt.ignore()
                self.setWindowState(QtCore.Qt.WindowMinimized)

    Si può fare una prova con questo frammento di codice nella interattiva interprete:

    >>> from PyQt4 import QtCore, QtGui
    >>> app = QtGui.QApplication([])
    >>> win = MyDialog()
    >>> win.show()
    >>> app.exec_()   #after this try to close the dialog, it wont close bu minimize
    • Grazie a voi per aiutare me. Ho trovato la mia risposta. Non so perché Qt.WindowMinimized non ha funzionato per me. Ho usato self.setVisible(False) invece di che. Anche perché ho usato QDialog, in alcuni gestori di finestre, l’utente è in grado di chiudere la finestra di dialogo con Esc key. poi ho ri implementare done funzione e fare loro stessi.
    • Nella documentazione si dice che il modo in cui la finestra di stato viene gestito è diversa nei Sistemi operativi. Su alcuni OS il cambiamento non è istantaneo, etc. Ho provato questa soluzione e ha lavorato bene su linux.

Lascia un commento