2014-11-14 14 views
5

Ho una domanda che ha una risposta ovvia per alcuni di voi, ma non riesco a capirlo.QMessageBox elimina alla chiusura

QMessageBox http://qt-project.org/doc/qt-5/qmessagebox.html ha 2 modi di essere visualizzato, o si fa exec() che fermare l'esecuzione del programma finché l'utente chiude la finestra di messaggio, o show() che ha appena visualizzare la casella (probabilmente nel thread separato o in qualche modo che permette programma di continuare mentre box è in attesa di utente).

Come si elimina la casella dopo l'utilizzo di show()?

Questo codice immediatamente chiuderlo, finestra di messaggio appare per nanosecondo e poi è andato:

QMessageBox *mb = new QMessageBox(parent); 
mb->setWindowTitle(title); 
mb->setText(text); 
mb->show(); 
delete mb; // obvious, we delete the mb while it was still waiting for user, no wonder it's gone 

questo codice fa lo stesso

QMessageBox mb(parent); 
mb.setWindowTitle(title); 
mb.setText(text); 
mb.show(); 
// obvious, as we exit the function mb which was allocated on stack gets deleted 

anche questo codice fa la stessa

QMessageBox *mb = new QMessageBox(parent); 
mb->setWindowTitle(title); 
mb->setText(text); 
mb->show(); 
mb->deleteLater(); // surprisingly this doesn't help either 

Quindi, come posso usare show() correttamente, senza dover gestire la cancellazione in modo complesso? C'è qualcosa come la funzione deleteOnClose() che gli direbbe semplicemente di cancellarsi una volta che l'utente la chiude?

risposta

9

È possibile utilizzare Qt::WA_DeleteOnClose bandiera

QMessageBox *mb = new QMessageBox(parent); 
mb->setAttribute(Qt::WA_DeleteOnClose, true); 
mb->setWindowTitle(title); 
mb->setText(text); 
mb->show(); 
2

Sì, c'è un 'delete su una stretta' concetto in Qt, in modo da poter configurare la tua casella di messaggio a seguire tale comportamento:

mb->setAttribute(Qt::WA_DeleteOnClose); 
0

voi può utilizzare quanto segue:

QMessageBox* msg = new QMessageBox; 
msg->setWindowTitle(title); 
msg->setText(text); 
connect(msg, SIGNAL(done(int)), msg, SLOT(deleteLater())); 
msg->show(); 

in questo modo distruggerà quando viene chiuso un d quando il ciclo degli eventi non ha altro da fare.

Problemi correlati