【发布时间】:2010-11-24 10:51:29
【问题描述】:
在 Qt4 中,有 QProcess::setProcessEnvironment() 用于为新生成的进程设置 Env 变量。
但是,QProcess::startDetached() 是静态成员函数,因此 setProcessEnvironment() 不适用。 Qt中如何为分离的进程设置Env变量?
【问题讨论】:
标签: qt qt4 environment-variables qprocess
在 Qt4 中,有 QProcess::setProcessEnvironment() 用于为新生成的进程设置 Env 变量。
但是,QProcess::startDetached() 是静态成员函数,因此 setProcessEnvironment() 不适用。 Qt中如何为分离的进程设置Env变量?
【问题讨论】:
标签: qt qt4 environment-variables qprocess
这是一个已知的老错误: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* 文件)。
【讨论】:
此行为已在 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");
【讨论】:
现在使用Qt5.5,遇到这个问题。
在Win7下,使用下面的代码,在父进程中设置环境,子进程似乎继承了环境。不确定,但它在我的情况下有效。
希望有更好的解决方案
QString oldPath = qgetenv( "Path" );
QByteArray newPath = ( QCoreApplication::applicationDirPath() + ";" + oldPath ).toLocal8Bit();
bool bSet = qputenv("Path", newPath);
if ( !bSet )
{
qDebug()<<"Failed";
}
【讨论】: