2011-11-17 13 views

risposta

30

È necessario collegare uno slot con il codice di pulizia al segnale QCoreApplication::aboutToQuit().

Questo consente di eliminare QObject con QObject::deleteLater() e gli oggetti saranno eliminati come non avete ancora lasciato il ciclo degli eventi principale dell'applicazione.

Se si utilizza una libreria C che richiede una chiamata di 'shutdown', è possibile farlo normalmente dopo il ritorno da QCoreApplication::exec().

Esempio per entrambe le tecniche:

int main(int,char**) 
{ 
    QApplication app; 
    library_init(); 
    QWidget window; 
    window.show(); 
    QObject::connect(&app, SIGNAL(aboutToQuit()), &window, SLOT(closing())); 
    const int retval = app.exec(); 
    library_close(); 
    return retval; 
} 
+3

Si noti che la documentazione Qt corrente consiglia specificamente di non fare nulla dopo la restituzione exec. Vedere (http://doc.qt.io/qt-5/qapplication.html#exec) –

+1

Si noti che un riavvio dal terminale o una connessione X persa innesca a :: exit() che non emette aboutToQuit. (almeno fino al 5.7) – ManuelSchneid3r

8

Per quanto riguarda la risposta di Silas Parker, la documentazione Qt dice questo circa il segnale aboutToQuit:

Il segnale è particolarmente utile se l'applicazione ha a che fare alcuni pulizia dell'ultimo secondo. Si noti che nessuna interazione dell'utente è possibile in questo stato .

Se si desidera che l'applicazione sia in grado di annullare il processo di uscire o consentire all'utente di effettuare un cambiamento dell'ultimo minuto prima della chiusura dell'applicazione, allora si può fare questo gestendo la funzione closeEvent nel vostro MainWindow.

void MainWindow::closeEvent(QCloseEvent *event) 
{ 
    if (maybeSave()) { 
     writeSettings(); 
     event->accept(); 
    } else { 
     event->ignore(); 
    } 
} 

Vedere la documentazione closeEvent per ulteriori informazioni.

+0

Come può essere gestito in QApplication invece di QMainWIndow? – prakashpun

+1

@ pra16 'QApplication' non ha realmente un corollario a' closeEvent'. Potresti provare a usare ['lastWindowClosed'] (http://doc.qt.io/qt-5/qguiapplication.html#lastWindowClosed) o utilizzare la gestione dei segnali per interrompere i segnali di sospensione/chiusura. –

Problemi correlati