同时使用 show() + exec()

Using both show() + exec()

我正在使用经常使用下一组调用的代码:

    QDialog my_qDialog(my_parent);
    my_qDialog->setModal(false);
    my_qDialog->hide();
    my_qDialog->show();
    my_qDialog->exec();

我还没有发现关于在原始文件中同时使用 show() + exec() 的任何信息。 因此父级未被阻止,"exec()" 旁边的代码仅在对话框关闭后执行。

问题是: 使用这样的代码正常吗?也许它有缺点?可以自由互动吗 与父级同时 exec() 是 运行?

提前感谢您提供的任何帮助

您是 re-entering exec() 中的事件循环。一般来说,如果你不小心,那会招致灾难。通过这样做,你假装发生了一些不真实的事情。世界是异步的。如果你想简化你的代码,你可以用 continuation-passing 风格重写它,其中延续将从 top-level 事件循环中调用。

您甚至可以分解出这段代码:

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
}