Неизвестная ошибка QProcess

У меня возникла странная проблема. 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 (которые запускают исполняемые файлы)? (Пробовал и с QProcess, не работает)


person DanilGholtsman    schedule 09.11.2013    source источник


Ответы (1)


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

Однако я настоятельно не рекомендую использовать их в основном потоке, так как тогда они блокируют пользовательский интерфейс.

person Frank Osterfeld    schedule 09.11.2013
comment
о, а как же пути? Я имею в виду, как их установить в этом случае? - person DanilGholtsman; 09.11.2013
comment
Ах, забыл передать имя исполняемого файла. Фиксированный. - person Frank Osterfeld; 09.11.2013
comment
о, спасибо, но я также имел в виду полный путь к .exe или он должен быть таким QStringLiteral("somepath/importdb_module")? - person DanilGholtsman; 09.11.2013
comment
вы можете указать там полный путь или изменить PATH через qt- project.org/doc/qt-5.0/qtcore/qprocessenvironment.html - person Frank Osterfeld; 09.11.2013