2014-11-14 2 views
5

У меня есть вопрос, который имеет очевидный ответ для некоторых из вас, но я просто не могу понять это.QMessageBox удалить при закрытии

QMessageBox http://qt-project.org/doc/qt-5/qmessagebox.html имеет 2 способа отображается, либо вы exec(), которые остановить выполнение программы, пока пользователь закрыть окно сообщения, или show() который просто отобразить окно (возможно, в отдельном потоке или в некотором роде, что позволяет программе продолжить пока поле ждет пользователя).

Как удалить окно после использования show()?

Этот код немедленно закрыть его, появляется окно сообщения для наносекунды, а затем он ушел:

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 

этот код делает то же самое

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 

также этот код делает то же самое

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

Так как я могу правильно использовать show(), не имея необходимости обрабатывать его удаление каким-то сложным способом? Есть ли что-то вроде функции deleteOnClose(), которая просто скажет, что она удалит себя, как только пользователь закроет ее?

ответ

9

Вы можете использовать Qt::WA_DeleteOnClose пометка

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

Да, есть «удалить на близком» концепции в Qt, так что вы можете настроить окно сообщений, чтобы следовать такому поведению:

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

вам может использовать следующее:

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

таким образом он уничтожит, когда он будет закрыт d, когда цикл события не имеет ничего общего.

 Смежные вопросы

  • Нет связанных вопросов^_^