Qt Выполнить внешнюю программу

20

Я хочу запустить внешнюю программу из моей QT-Programm. Единственным рабочим решением было:

system("start explorer.exe");

Но он работает только для окон и запускает командную строку на мгновение.

Следующее, что я пробовал, было:

QProcess process;
QString file = QDir::homepath + "file.exe";
process.start(file);
//process.execute(file); //i tried as well

Но ничего не произошло. Любые идеи?

    
задан Testerrrr 18.10.2013 в 07:41
источник
  • Что говорит thomas_b. Кроме того, подключитесь к сигналам finished () и error () и вызовите errorString () в случае ошибки, чтобы узнать о том, что происходит не так. –  Frank Osterfeld 18.10.2013 в 08:59

3 ответа

20

Если ваш объект process является переменной в стеке (например, в методе), код не будет работать так, как ожидалось, потому что процесс, который вы уже начали, будет убит в деструкторе QProcess , когда метод заканчивается.

void MyClass::myMethod()
{
    QProcess process;
    QString file = QDir::homepath + "file.exe";
    process.start(file);
}

Вместо этого вы должны выделить объект QProcess в куче:

QProcess *process = new QProcess(this);
QString file = QDir::homepath + "/file.exe";
process->start(file);
    
ответ дан tomvodi 18.10.2013 в 08:20
источник
  • Будет ли QProcess автоматически освобождать себя, когда процесс начнется? –  user1767754 31.10.2014 в 08:39
  • Нет, не будет. Если объект процесса удаляется, он уничтожает соответствующий процесс. С помощью статического метода QProcess :: startDetached можно запустить новый процесс без поддержки экземпляра QProcess. –  tomvodi 31.10.2014 в 09:02
  • Есть ли другой подход, начинающий процесс? Я просто хочу запустить процесс и забыть об этом. –  user1767754 31.10.2014 в 09:03
  • Да, с указанным статическим методом QProcess: startDetached –  tomvodi 31.10.2014 в 09:13
  • О, это действительно скрыто, я задал этот вопрос пару минут назад, возможно, вы можете отправить свой ответ там, тогда он доступен для всех. stackoverflow.com/questions/26670147/... –  user1767754 31.10.2014 в 09:19
5

Если вы хотите, чтобы ваша программа ждала во время выполнения процесса, вы можете использовать

QProcess::execute(file);

вместо

QProcess process;
process.start(file);
    
ответ дан nv95 17.11.2015 в 16:45
источник
  • Это вариант, который стоит рассмотреть. Execute - это функция удобства, которая выполняет процесс и ждет завершения. Это статично. Вы не называете его экземпляром QProcess. –  cgmb 17.11.2015 в 18:32
5

QDir :: homePath не заканчивается разделителем. Действительный путь к вашему exe

QString file = QDir::homePath + QDir::separator + "file.exe";
    
ответ дан nnesterov 18.10.2013 в 08:00
источник