同时使用show()+ exec()

时间:2018-04-05 07:33:59

标签: c++ qt dialog qdialog

我正在处理经常使用下一组呼叫的代码:

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

我还没有发现在原始中同时使用show()+ exec()。 结果父母没有被阻止,而且#34; exec()"旁边的代码被阻止了。仅在关闭对话框后执行。

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

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

1 个答案:

答案 0 :(得分:0)

您正在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
}