У меня есть вопрос, который имеет очевидный ответ для некоторых из вас, но я просто не могу понять это.
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()
функция, которая просто скажет ему удалить себя, как только пользователь закроет его?
Ты можешь использовать Qt::WA_DeleteOnClose
флаг
QMessageBox *mb = new QMessageBox(parent);
mb->setAttribute(Qt::WA_DeleteOnClose, true);
mb->setWindowTitle(title);
mb->setText(text);
mb->show();
Да, в Qt есть концепция «удалить при закрытии», так что вы можете сконфигурировать свое окно сообщения, чтобы оно следовало такому поведению:
mb->setAttribute(Qt::WA_DeleteOnClose);
Вы можете использовать следующее:
QMessageBox* msg = new QMessageBox;
msg->setWindowTitle(title);
msg->setText(text);
connect(msg, SIGNAL(done(int)), msg, SLOT(deleteLater()));
msg->show();
таким образом он разрушится, когда закроется и когда циклу обработки событий больше нечего будет делать.