Как запустить отдельное приложение командой терминала в приложении Qt?

Я хочу использовать команды:

cd /opencv/opencv-3.0.0-alpha/samples/cpp/
./cpp-example-facedetect lena.jpg

для запуска примера кода OpenCV для кнопки clicked() в приложении Qt. Поэтому я использую:

void MainWindow::on_btSample_clicked()
{
        QProcess process1;
        QProcess process2;

        process1.setStandardOutputProcess(&process2);

        process1.start("cd /opencv/opencv-3.0.0-alpha/samples/cpp");
        process1.waitForBytesWritten();
        process2.start("./cpp-example-facedetect lena.jpg"); 
}

Я добавил необходимую библиотеку, чтобы использовать его. Но у меня ошибка при запуске приложения.

QProcess: Destroyed while process ("./cpp-example-facedetect") is still running.

Как я могу это исправить? Если способ, который я делаю, неверен, пожалуйста, дайте мне другой способ. Спасибо заранее!


person My Will    schedule 13.04.2016    source источник
comment
попробуйте с process2.waitForFinished();   -  person Marco    schedule 13.04.2016
comment
@Марко, я пробовал это, но ничего не получил, на экране нет ни ошибки, ни результата.   -  person My Will    schedule 13.04.2016


Ответы (1)


Я думаю, что у вас есть две проблемы:

Во-первых, ваш QProcess process2, вероятно, выходит за рамки до того, как он завершится (т.е. уничтожается, поскольку выходит за рамки). Вам либо нужно дождаться его завершения (используя waitForFinished(), либо сделать его указателем или переменной-членом (чтобы изменить область действия) и подключить сигнал finished() к некоторому слоту обработки (который может выполнить уборку).

Другое дело, похоже, что вы просто хотите установить рабочий каталог, поэтому я не думаю, что передача команды cd в ваш исполняемый файл - это путь, было бы проще сделать что-то вроде:

ИЗМЕНИТЬ

Я отредактировал свой пример, чтобы показать вам, как получить вывод:

QProcess myProc;

qDebug() << "Starting process\n";
// Setup the working directory
QDir::setCurrent("D:\\software\\qtTest");

// Start the process (uses new working dir)
myProc.start("test.bat");

myProc.waitForFinished();
qDebug() << myProc.readAll();

Я сделал это на своем окне Windows примерно за 2 минуты и протестировал для вас... Я мог бы сделать это на Linux, но это займет у меня немного больше времени, потому что мне нужно загрузить его: o ... но если вы хотите Я буду.

ИЗМЕНИТЬ 2

Если вы хотите полностью отключить процесс:

QProcess myProc;

qDebug() << "Starting process\n";
// Setup the working directory
QDir::setCurrent("D:\\software\\qtTest");

// Start the process (uses new working dir)
myProc.startDetached("test.bat");

Теперь я не уверен на 100%, что вы можете вернуть результат процесса... теперь это не имеет ничего общего с вашим приложением Qt...

person code_fodder    schedule 13.04.2016
comment
Я пробовал это, но ничего не получил, на экране нет ни ошибки, ни результата. У вас есть другой способ заставить его работать? Спасибо - person My Will; 13.04.2016
comment
Я отредактировал свой пример... Я думаю, что он работает для вас, но вы ничего не видите, возможно, потому, что вы не получаете вывод?... так что используйте waitForFinished(), а затем прочитайте вывод, используя readAll(). ЕСЛИ это долгий процесс, вам, вероятно, нужно настроить его по-другому и дождаться сигнала readReady() и прочитать вывод по мере его поступления... снова с использованием слота/сигнала. Если вам нужен этот пример, его написание займет больше времени. - person code_fodder; 13.04.2016
comment
большое спасибо. пример кода запускается как приложение виджета, он покажет изображение, но я не знаю, что в моем случае необходимо извлечение. Мне нужно просто запустить его и не заботиться о результате: D. - person My Will; 13.04.2016
comment
о, но в настоящее время мое приложение ничего не показывает, когда я нажимаю кнопку :(. Это не то, чего я ожидаю :( - person My Will; 13.04.2016
comment
О, простите... что вы имеете в виду? Что вы хотите, чтобы он показал? Я не на 100% ясен. Код, который я написал, будет отправлять текст только для отладки... не в графический интерфейс. - person code_fodder; 13.04.2016
comment
я имею в виду, что мне нужно запустить образец приложения отдельно. Это не связывает мое приложение. и дополнительная информация о примере приложения: .exe в конце его имени. Не знаю, это частный случай? извините за мой плохой английский: D. мое объяснение так плохо :D - person My Will; 13.04.2016
comment
хм... Я think понимаю, что вы имеете в виду... взгляните на startDetached(), это запустит приложение в новом процессе, но отсоединит его от вашего приложения. Итак... если вы закроете свое приложение Qt, cpp-example-facedetect продолжит работу... позвольте мне снова попробовать переделать мой пример. - person code_fodder; 13.04.2016
comment
о, определенно. Опять беспокою тебя, так что извини, мой друг :D - person My Will; 13.04.2016
comment
Итак.... Я добавил пример, он на самом деле проще. Когда я запускаю это, теперь я вижу, что запускается отдельная командная строка (в вашем случае какой-то другой графический интерфейс?), и я закрываю свое приложение Qt, и оно все еще работает. Мой bat-файл постоянно пингует www.google.com :o - person code_fodder; 13.04.2016
comment
Я нашел свою проблему. Большое спасибо :) - person My Will; 13.04.2016
comment
Круто :) ... помните, если это было что-то отличное от того, что в моем ответе, вы должны уточнить это, чтобы следующий человек мог прочитать об этом :) - person code_fodder; 13.04.2016