Установить переменные среды для startDetached() QProcess

В Qt4 есть QProcess::setProcessEnvironment() для установки переменных Env для нового порожденного процесса.

Однако QProcess::startDetached() является статической функцией-членом, поэтому setProcessEnvironment() не применяется. Как установить переменные Env для отдельного процесса в Qt?


person Shen Chen    schedule 24.11.2010    source источник


Ответы (3)


Это известная старая ошибка: http://bugreports.qt-project.org/browse/QTBUG-2284. Вам нужно перегрузить функцию startDetached для поддержки вашей собственной среды. Взгляните на исходники Qt, чтобы узнать, как это сделать: http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io?h=5.5 (qprocess* файлов).

person Giuseppe Cardone    schedule 24.11.2010
comment
Переопределение startDetached() должно решить проблему, попробуем завтра. Удивлен, узнав, как долго сохраняется эта ошибка. Необходимость вызывать putenv() в пользовательском коде уродлива. Это должно было быть сделано в Qt. - person Shen Chen; 24.11.2010
comment
И видимо этот баг до сих пор не исправлен. Я использую Qt 4.8.4, и у меня такая же проблема. Пытаюсь запустить внешнее консольное приложение из моего приложения Qt и хотел бы видеть окно консоли, но мне также нужно установить различные параметры среды для этого процесса, и это не работает при его запуске отдельно. - person Jeff; 20.01.2015

Это поведение было исправлено в Qt 5.10.0. Однако порядок вызовов кажется важным. Следующий пример работает:

QProcess proc;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("var-name", "var-value");
proc.setProgram("program-path");
proc.setProcessEnvironment(env);
proc.startDetached();

пока это не работает:

QProcess proc;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("var-name", "var-value");
proc.setProcessEnvironment(env);
proc.startDetached("program-path");
person Bowdzone    schedule 07.08.2019

Используя Qt5.5 сейчас, столкнулись с этой проблемой.

В Win7 используется код ниже, установка среды в отцовском процессе. Кажется, что подпроцесс наследует среду. Не факт, но в моем случае сработало.

Надеюсь, есть лучшие решения

QString oldPath = qgetenv( "Path" );
QByteArray newPath = ( QCoreApplication::applicationDirPath() + ";" + oldPath ).toLocal8Bit();
bool bSet = qputenv("Path", newPath);
if ( !bSet )
{
    qDebug()<<"Failed";
}
person Ian.Zhang    schedule 13.10.2015