【发布时间】:2018-03-15 15:14:51
【问题描述】:
我正在开发一个用户可以解析一些二进制文件的应用程序。一旦他点击“解析”按钮,他首先可以选择一些文件,然后对其进行解析。在应用程序处理文件时,我想显示一个模式对话框,通知用户进度(QProgressBar 栏)和已解析的文件(QListView 列表/listModel)。
我目前的方法是覆盖 QDialog-sublcas 的 exec()-method。这样我就可以打电话了
parseAssistant.exec()
当前的实现如下所示:
class ParseAssistant : public QDialog { public: int exec(); };
int ParseAssistant::exec()
{
bar->setMaximum(files.size());
this->show();
this->setModal(true);
for (int i = 0; i < files.size(); i++) {
PluginTable* table = parser.parse(files[i]);
// do something with the table
// saveTableintoDB();
// update GUI
// bar->setValue(i);
// listModel->insertRow(0, new QStandardItem(files[i]));
}
this->hide();
return QDialog::Accepted;
}
在这个(阻塞)方法运行后,用户要么解析了所有文件,要么在某处取消了进度。为了实现这一点,我尝试在 while 循环中使用 QApplication::processEvents (感觉有点滞后,因为它仅在文件完成解析时才进行)或将繁重的计算外包给一些 QConcurrent 实现(::run, ::映射)。不幸的是,我不知道如何在 QFuture 完成后将程序流返回到 exec() 方法,而不依赖于一些 CPU 密集型循环,例如:
while (!future.isFinished()) { QApplication::processEvents(); }
有没有更聪明的方法来让模态对话框运行繁重的计算(可能被用户取消)而不阻塞事件循环?
【问题讨论】:
标签: c++ qt qdialog qtconcurrent