На самом деле, это работает как описано в ОП.
Это мой MCVE для демонстрации.
1) дочернее приложение testQProcessChild.cc
:
#include <chrono>
#include <thread>
#include <iostream>
int main()
{
std::cout << "testQProcessChild started.\n"
<< "Sleeping for three seconds...\n";
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "testQProcessChild exits.\n";
return 0;
}
Скомпилировано и протестировано:
$ g++ -std=c++11 -o testQProcessChild testQProcessChild.cc
$ ./testQProcessChild
testQProcessChild started.
Sleeping for three seconds...
testQProcessChild exits.
$
2) приложение Qt testQProcessDetached.cc
:
#include <QtWidgets>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QProcess qProcess;
//qProcess.closeWriteChannel();
//qProcess.closeReadChannel(QProcess::StandardOutput);
//qProcess.closeReadChannel(QProcess::StandardError);
if (qProcess.startDetached(QString::fromLatin1("./testQProcessChild"))) {
qDebug() << "./testQProcessChild started.";
} else {
qDebug() << "Cannot start ./testQProcessChild!";
}
qDebug() << "testQProcessDetached exiting.";
return 0;
}
с файлом проекта testQProcessDetached.pro
:
SOURCES = testQProcessDetached.cc
QT = widgets
Скомпилировано и протестировано:
$ qmake-qt5 testQProcessDetached.pro
$ make
$ ./testQProcessDetached
testQProcessChild started.
Sleeping for three seconds...
./testQProcessChild started.
testQProcessDetached exiting.
$ testQProcessChild exits.
Обратите внимание, что testQProcessDetached
выходы, которые можно увидеть как приглашение $
, появляются снова. Примерно через 3 секунды появляется вывод testQProcessChild exits.
(чтобы доказать, что testQProcessChild
переживает testQProcessDetached
).
Я подозревал, что могут возникнуть проблемы с подключением к каналу. Поэтому после первой успешной попытки я прокомментировал вызовы close???Channel()
и повторил тест & ndash; с тем же результатом, что и раньше.
Я тестировал в cygwin64 в Windows 10.
Образец testQProcessDetached.cc
изменен, чтобы стать приложением с графическим интерфейсом:
#include <QtWidgets>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QPushButton qBtn(QString::fromUtf8("Start Child"));
qBtn.show();
QObject::connect(&qBtn, &QPushButton::clicked,
[&](bool) {
QProcess qProcess;
//qProcess.closeWriteChannel();
//qProcess.closeReadChannel(QProcess::StandardOutput);
//qProcess.closeReadChannel(QProcess::StandardError);
if (qProcess.startDetached(QString::fromLatin1("./testQProcessChild"))) {
qDebug() << "./testQProcessChild started.";
QApplication::quit();
} else {
qDebug() << "Cannot start ./testQProcessChild!";
}
});
return app.exec();
}
Скомпилировано и протестировано:
$ qmake-qt5 testQProcessDetached.pro
$ make
$ ./testQProcessDetached
![snapshot of testQProcessDetached](https://i.stack.imgur.com/4zhfm.png)
Нажмите
testQProcessChild started.
Sleeping for three seconds...
./testQProcessChild started.
testQProcessDetached exiting.
$ testQProcessChild exits.
Я скомпилировал второй пример на VS2013 с Qt для Windows. Это сработало.
![snapshot of testQProcessDetached (compiled with VS2013)](https://i.stack.imgur.com/YbjGx.png)
Таким образом, мне пришлось заменить относительный путь ./testQProcessChild
на абсолютный путь (хотя оба двоичных файла находились в одном каталоге). Как и об этом говорит OP, меня это не волновало.