我正在处理经常使用下一组呼叫的代码:
QDialog my_qDialog(my_parent);
my_qDialog->setModal(false);
my_qDialog->hide();
my_qDialog->show();
my_qDialog->exec();
我还没有发现在原始中同时使用show()+ exec()。 结果父母没有被阻止,而且#34; exec()"旁边的代码被阻止了。仅在关闭对话框后执行。
问题是: 使用这样的代码是正常的吗?也许它有缺点?我可以自由互动吗? 与exec()运行时的父级?
提前感谢您提供的任何帮助
答案 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
}