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() функция, которая просто скажет ему удалить себя, как только пользователь закроет его?

5

Решение

Ты можешь использовать Qt::WA_DeleteOnClose флаг

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

Другие решения

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

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

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

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

таким образом он разрушится, когда закроется и когда циклу обработки событий больше нечего будет делать.

0
По вопросам рекламы [email protected]