gpt4 book ai didi

c++ - 当 QFileDialog::getExistingDirectory 处于事件状态时,QSerialPort 停止响应

转载 作者:行者123 更新时间:2023-11-30 05:27:42 30 4
gpt4 key购买 nike

我的应用程序在使用 QFileDialog::getExistingDirectory 时停止使用 QSerialPort 接收数据。它在对话框关闭后恢复接收数据。有什么办法可以避免吗?

最佳答案

您正在调用一个阻塞方法。当该方法执行时,事件循环无法运行,因为它位于调用堆栈底部的某个位置,等待您的插槽返回给它。这是同步的编码方式,不能反射(reflect)真正发生的事情,因为世界是异步的。所以不要那样编码。

相反,您应该在它不可见时设置文件对话框,然后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);
}

关于c++ - 当 QFileDialog::getExistingDirectory 处于事件状态时,QSerialPort 停止响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37141339/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com