当QFileDialog :: getExistingDirectory处于活动状态时,QSerialPort停止响应

时间:2016-05-10 14:23:39

标签: c++ qt

我的应用程序在使用QFileDialog::getExistingDirectory时停止使用QSerialPort接收数据。关闭对话框后,它将恢复接收数据。有没有办法防止这种情况?

1 个答案:

答案 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);
}