【发布时间】:2016-07-25 20:00:05
【问题描述】:
我正在使用 QProcess 运行 wscript 来运行将 Excel 文件转换为制表符分隔的文本文件的 VB 脚本。该脚本运行良好,一切正常,但 GUI 冻结,用户在很长一段时间内无法与其交互。代码如下:
/* Create txt files and store paths */
for (int i = 0; i < excelFilepaths.size(); ++i) {
wscript->start("wscript.exe", QStringList() << vbs.fileName() << excelFilepaths.at(i) << newDir.absolutePath() + "/" + QString::number(i + 1));
wscript->waitForFinished();
payloadPaths.push_back(newDir.absolutePath() + "/" + QString::number(i + 1));
}
所以我有多个 excel 文件路径和一个在堆上分配的 QProcess。此 QProcess 运行将 excel 文件转换为文本文件的 VB 脚本,然后存储新文本文件的路径。这需要很长时间(4 个 excel 文件大约需要 20 秒)。在此期间,GUI 被冻结。我希望用户能够使用不干扰该过程的部分 GUI。
现在我怀疑这个问题的原因是
QProcess::waitForFinished()
我在网上阅读了有关连接 QProcess 的 finished() 和 error() 信号以消除此问题的信息。但是我一直很难做到这一点。我将此代码作为继承自 QObject 并包含 Q_OBJECT 宏的类的方法运行,因此应设置所有内容。我只是需要一些帮助把剩下的部分放在一起。我怎样才能让它在 QProcess 运行时我的 GUI 不会冻结?请帮忙。
【问题讨论】:
-
但是我在这样做时遇到了困难 你有什么尝试?什么失败了?
-
“我怎样才能让我的 GUI 在 QProcess 运行时不会冻结?” - 通过 “连接完成()和错误()信号QProcess" 到本地槽,并删除同步的
waitForFinished调用。 -
我该如何连接这些信号呢?这如何消除我的问题?我想我会做类似 connect(process, &QProcess::finished, this, &CustomClass::slotHere) 之类的事情。或者我可以摆脱自定义插槽并执行 connect(process, &QProcess::finished, lambdaHere)。一个例子会很有帮助