【问题标题】:Expand environment variables in Qt (getenv equivalent)在 Qt 中展开环境变量(getenv 等效)
【发布时间】:2012-12-21 10:42:30
【问题描述】:

我正在寻找 getenv 函数的等效项。

【问题讨论】:

    标签: c++ qt environment-variables


    【解决方案1】:

    Qt 有一个围绕getenv() 的包装器,称为qgetenv()

    QByteArray qgetenv ( const char * varName )
    

    getenv() 是一个标准函数,但 Visual Studio 已弃用它,这就是 Qt 提供 qgetenv() 包装器的原因。

    请注意,如果您对获取标准文件系统位置(如主目录、应用程序数据目录等)感兴趣,则应改为使用 QDesktopServices::storageLocation() (Qt 4) 或 QStandardPaths::writableLocation() (Qt 5)。

    【讨论】:

    • 这是一个扩展任何环境变量的函数,比如%PATH%等吗?例如,我在调用进程之前从命令行设置的自定义环境变量?
    • @satuon 否。它为您提供标准位置,例如用户的主目录和应用程序数据目录。和别的。自定义环境变量当然需要使用 getenv() 获取。 Qt 没有抽象 getenv(),因为它是所有标准 C++ 编译器上可用的标准函数。
    • 其实有 qgetenv:doc.qt.digia.com/qt/qtglobal.html#qgetenv 因为: "qgetenv() 是因为标准 C 库中的 getenv() 在 VC2005(及更高版本)中被弃用了。qgetenv() 使用新的替代品VC 中的函数,并在所有其他平台上调用标准 C 库的实现。”
    • @FrankOsterfeld 不错。我不知道的事情。
    • 在什么意义上?它回答了我的问题,即:我一般如何扩展环境变量,Qt 中是否存在与 getenv 等价的方法。我只是给出了用 %APPDATA% 和 $HOME 编造的例子,我并不特别需要它们。我已经编辑了我的问题以删除对它们的任何提及,现在我希望它更清楚。
    【解决方案2】:

    对于 Qt,在访问环境变量时还有一种“高级”方法。这只有在您的 Qt 应用程序在 QCoreApplication 中运行时才有效,大多数 Qt 应用程序都应该是这种情况。

    在这种情况下,对于至少 4.6 的 Qt 版本,您可以使用 QProcessEnvironment。您可以通过使用访问当前进程环境

    QProcessEnvironment::systemEnvironment();
    

    您可以通过

    查询任何变量
    QProcessEnvironment::systemEnvironment().value("<variablename>", "<defaultvalue>");
    

    这应该比在大多数情况下使用 getenv/qgetenv 方法更方便,因为这会以更通用的方式隐藏操作系统实现,恕我直言,它也是一种更“类似 Qt”的方法。

    【讨论】:

    • 另外,与getenv 不同,它正确支持包含Unicode 字符的环境变量。
    • QProcessEnvironment 旨在与 QProcess 一起使用,为子进程设置环境。 不能用来改变当前进程的环境,见文档[QProcessEnvironment](doc.qt.io/qt-5/qprocessenvironment.html#details)
    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-06-10
    • 1970-01-01
    • 2014-02-02
    • 2013-05-04
    相关资源
    最近更新 更多