我的应用程序在使用QFileDialog::getExistingDirectory
时停止使用QSerialPort接收数据。关闭对话框后,它将恢复接收数据。有没有办法防止这种情况?
答案 0 :(得分:1)
您正在调用阻止方法。当该方法执行时,事件循环无法运行,因为它位于调用堆栈底部的某个位置,等待您的插槽返回到它。这是同步的编码方式,不能反映真实情况,因为世界是异步的。所以不要那样编码。
相反,您应该设置不可见的文件对话框,然后show()
,并在连接到QDialog::accepted()
信号的插槽中执行所需的代码。
您可以将设置考虑在内并拥有一个很好的异步助手,与getExistingDirectory
类似:
template <typename F> void withExistingDirectoryDo(F && fun, QObject * context = 0,
QWidget * parent = 0, const QString & caption = QString(),
const QString & dir = QString(), Options options = QFileDialog::ShowDirsOnly) {
auto * dialog = new QFileDialog(parent);
auto helper = [fun, dialog]{ fun(dialog->directory()); };
if (context)
connect(dialog, &QDialog::accepted, context, helper);
else
connect(dialog, &QDialog::accepted, helper);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setOptions(options);
dialog->setFileMode(QFileDialog::Directory);
dialog->show();
}
以下是代码转换:
void before() {
foo();
auto dir = QFileDialog::getExistingDirectory(); // bad synchronous code
bar(dir);
}
void after() {
foo();
withExistingDirectoryDo([this](const QDir & dir) {
bar(dir);
}, this);
}