Использование обоих 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
}
Другие вопросы по тегам