Использование обоих show() + exec()
Я работаю с кодом, где часто используется следующая группа вызовов:
QDialog my_qDialog(my_parent);
my_qDialog->setModal(false);
my_qDialog->hide();
my_qDialog->show();
my_qDialog->exec();
Я не нашел ничего об использовании обоих show() + exec() в сыром виде. В результате родительский элемент не блокируется, а код рядом с "exec()" выполняется только после закрытия диалога.
Вопрос в том, нормально ли использовать такой код? Может быть, это имеет недостатки? Могу ли я свободно взаимодействовать с родителем во время выполнения exec ()?
Заранее благодарим за любую помощь, которую вы можете предоставить
1 ответ
Вы повторно входите в цикл событий в exec()
, Вообще говоря, это приводит к катастрофе, если вы не будете осторожны. Делая это, вы притворяетесь, что происходит что-то, что не соответствует действительности. Мир асинхронен. Если вы хотите упростить свой код, вы можете переписать его в стиле передачи продолжения, где продолжение будет вызываться из цикла событий верхнего уровня.
Вы даже можете выделить этот код:
template<typename T>
T *show(std::function<void(QDialog*)> fun) {
show({}, std::move(fun));
}
template<typename T>
T* show(QWidget *parent, std::function<void(QDialog*)> fun) {
auto dialog = new T(parent);
dialog->setModal(false);
dialog->show();
dialog->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(dialog, &QDialog::finished, [dialog, f = std::move(fun)]{
f(dialog);
});
return dialog;
}
Затем написать:
void Class::myMethod() {
show<MyDialog>(my_parent, [](QDialog *dialog){
// do things when the dialog is finished
});
}
вместо:
void Class::myMethod() {
MyDialog dialog{my_parent};
dialog.exec();
// do things when the dialog is finished
}