1

我遇到了奇怪的问题。QProcess 只是不工作!

并且错误未知。

我在标题中有全局变量

QProcess *importModule;

我得到了这个功能(我尝试了两种start方法startDetached

    void App::openImport(){
      importModule = new QProcess();
      importModule->setWorkingDirectory(":\\Resources");
      importModule->startDetached("importdb_module.exe");
      QMessageBox::information(0,"",importModule->errorString());
}

它只是输出那个error is unknown。它也不会启动其他exes,比如

    void App::openImport(){
      importModule = new QProcess();
      importModule->setWorkingDirectory("C:\\Program Files\\TortoiseHg");
      importModule->startDetached("hg.exe");
      QMessageBox::information(0,"",importModule->errorString());
}

我做错了什么?还有其他方法可以.exe从我的程序中运行一些吗?或者也许.bat是文件(运行exes)?(也用 QProcess 试过,不工作)

4

1 回答 1

3

startDetached()是一个静态方法,根本不运行importModule。它开始一个过程,然后停止关心。因此,error()/errorState()与调用importModule无关。startDetached()你想要的是start(). 然而,由于 QProcess 是异步的,所以在 start() 返回之后什么都不会发生。您必须连接到started()和信号以了解结果error()finished()

connect(importModule, SIGNAL(started()), this, SLOT(importModuleStarted()));
connect(importModule, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(importModuleFinished(int, QProcess::ExitStatus)));
CONNECT(importModule, SIGNAL(error(QProcess::ProcessError)), this, SLOT(importModuleError(QProcess::ProcessError)));
importModule->start(QStringLiteral("importdb_module"), QStringList());

或者,您可以使用阻塞等待功能:

importModule->start(QStringLiteral("importdb_module"), QStringList());
importModule->waitForStarted(); // waits until starting is completed
importModule->waitForFinished(); // waits until the process is finished

但是,我强烈建议不要在主线程中使用它们,因为它们会阻塞 UI。

于 2013-11-09T08:39:40.913 回答