2013-10-05 21 views

risposta

7

Se si utilizza il ciclo di eventi Qt, si può prendere il seguente segnale:

QCoreApplication vuoto :: aboutToQuit() [segnale]

Questo segnale viene emesso quando l'applicazione è in procinto di uscire dal ciclo principale degli eventi, ad es quando il livello del loop eventi scende a zero. Ciò può accadere dopo una chiamata a uscire() dall'interno dell'applicazione o quando gli utenti interrompono l'intera sessione desktop. Il segnale è particolarmente utile se l'applicazione deve eseguire una pulizia dell'ultimo secondo. Nota che nessuna interazione dell'utente è possibile in questo stato.

Oltre a questo, si può essere alla ricerca per i seguenti messaggi di seguito se il segnale di cui sopra non è appropriata per il caso d'uso:

WM_QUIT: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632641(v=vs.85).aspx

WM_CLOSE: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx

WM_QUERYENDSESSION : http://msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx

WM_ENDSESSION: http://msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx

2

penso che le altre risposte completamente perdere il punto: Quando si forza finisce un'applicazione, è come SIGKILL su Unix. Non c'è modo di gestirlo - tranne in anticipo. Ciò che intendo per gestirlo prima del tempo è assicurarsi di salvare le impostazioni ogni volta che vengono cambiate. Ovviamente è possibile ottimizzare questo comportamento, ad esempio salvare le impostazioni ogni pochi secondi se sono sporche, se si desidera ridurre al minimo il numero di accessi al disco (pensare al consumo di energia sui dispositivi mobili).

Molto di questo è gestito da QSettings per voi. Finché usi QSettings, otterrai un comportamento ragionevole. Se stai salvando i file da solo, usa QSaveFile poiché tratta lo svuotamento del file e l'approssimazione della sostituzione di un file atomico, in modo da non perdere le impostazioni se l'eliminazione (terminazione forzata) avviene nel mezzo della scrittura.

Il segnale aboutToQuit emesso da QCoreApplication è ciò a cui si desidera reagire se si desidera eseguire semplicemente qualcosa quando l'applicazione viene chiesta di uscire. Questo equivale a gestire il messaggio WM_QUIT, o a trattare con SIGTERM su Unix. Quindi farlo in modo specifico per la piattaforma è inutile come già fa Qt per te. È altrettanto inutile gestire lo WM_CLOSE in quanto si tratta di un messaggio che riceve solo Windows, e Qt lo gestisce già per te.

È inoltre possibile partecipare al processo di disconnessione/spegnimento installando un QAbstractNativeEventFilter ed elaborando lo WM_ENDSESSION e WM_QUERYENDSESSION. Questo ha senso solo se vuoi sapere in anticipo che l'applicazione verrà chiusa.A meno che non si desideri interrompere esplicitamente l'arresto/disconnessione, non è necessario preoccuparsene.

+0

Non sapevo abouttoQuit gestisce SIGTERM su Linux, ma per quanto riguarda SIGHUP & SIGINT, SIGHUP è di solito inviata al applicazioni su Disconnetti nella Linux, è per questo che ho usato gestori di segnale (Specifico della piattaforma Qt way) su linux –

+0

Nulla sulla domanda dice che l'applicazione viene forzatamente terminata. Menziona 'SIGTERM' che è un segnale di spegnimento aggraziato, non' SIGKILL'. – qris