2014-11-14 19 views
5

Ich habe eine Frage, die offensichtliche Antwort für einige von Ihnen hat, aber ich kann es einfach nicht herausfinden.QMessageBox löschen beim Schließen

QMessageBox http://qt-project.org/doc/qt-5/qmessagebox.html hat 2 Möglichkeiten der angezeigt wird, entweder Sie tun exec(), die die Programmausführung, bis der Benutzer beenden das Meldungsfeld schließen, oder show(), die gerade die Box anzuzeigen (wahrscheinlich in separaten Thread oder in irgendeiner Weise das Programm ermöglicht es weiterhin während Box auf Benutzer wartet).

Wie lösche ich die Box, nachdem ich show() verwende?

Dieser Code sofort es schließen, wird Meldungsfeld für Nanosekunde und es dann weg: die gleiche

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

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 

dieser Code macht das gleiche

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 

auch tut dieser Code

Also wie kann ich show() richtig verwenden, ohne mit seiner Löschung auf eine komplexe Art und Weise umgehen zu müssen? Gibt es etwas wie deleteOnClose() Funktion, die es nur sagen würde, um sich selbst zu löschen, sobald Benutzer es schließen?

Antwort

9

können Sie Qt::WA_DeleteOnClose Flag verwenden

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

Ja, es ist ein Konzept, in Qt 'auf eine enge löschen', so dass Sie Ihre Meldungsfeld konfigurieren können ein solches Verhalten folgen:

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

Sie kann folgendes verwenden:

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

so wird es zerstören, wenn es geschlossen wird d wenn die Ereignisschleife nichts anderes zu tun hat.