【问题标题】:Set Environment Variables for startDetached() QProcess为 startDetached() QProcess 设置环境变量
【发布时间】:2010-11-24 10:51:29
【问题描述】:

在 Qt4 中,有 QProcess::setProcessEnvironment() 用于为新生成的进程设置 Env 变量。

但是,QProcess::startDetached() 是静态成员函数,因此 setProcessEnvironment() 不适用。 Qt中如何为分离的进程设置Env变量?

【问题讨论】:

    标签: qt qt4 environment-variables qprocess


    【解决方案1】:

    这是一个已知的老错误:http://bugreports.qt-project.org/browse/QTBUG-2284。你需要重载startDetached 函数来支持你自己的环境。查看 Qt 源代码以了解如何做到这一点:http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io?h=5.5qprocess* 文件)。

    【讨论】:

    • 重写 startDetached() 应该可以解决问题,明天试试。惊讶地发现这个错误持续了多长时间。不得不在用户代码中调用 putenv() 是丑陋的。这应该在 Qt 中完成。
    • 显然这个错误还没有被修复。我正在使用 Qt 4.8.4 并且遇到了同样的问题。尝试从我的 Qt 应用程序启动外部控制台应用程序并希望看到控制台窗口,但我还需要为该进程设置各种环境设置,并且在分离启动时不起作用。
    【解决方案2】:

    此行为已在 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");
    

    【讨论】:

      【解决方案3】:

      现在使用Qt5.5,遇到这个问题。

      在Win7下,使用下面的代码,在父进程中设置环境,子进程似乎继承了环境。不确定,但它在我的情况下有效。

      希望有更好的解决方案

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 2015-09-03
        • 2013-01-29
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        相关资源
        最近更新 更多