同时使用 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
}
我正在使用经常使用下一组调用的代码:
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
}