在运行时将更改环境变量应用于应用程序

Posted

技术标签:

【中文标题】在运行时将更改环境变量应用于应用程序【英文标题】:Apply changed environment variables to QApplication at runtime 【发布时间】:2019-10-02 14:13:33 【问题描述】:

我正在尝试运行

qputenv("QT_DEBUG_PLUGINS", "1");

在 QT 应用程序的 MainWindow 进行评估之后的运行时。

我假设要实际应用新的环境变量,我必须关闭初始化的 QApplication 并重新启动它,但我无法使其工作。

#include <QApplication>
#include "mainwindow.h"


int main(int argc, char *argv[])

    int exitCode = 0;
    do
    
        //exitCode = EXIT_CHANGE_DEBUG_FLAG; //This will make it ALWAYS work

        //Double-checking for testing only, still does not work.
        if(exitCode == EXIT_CHANGE_DEBUG_FLAG)
        
            qputenv("QT_DEBUG_PLUGINS", "1"); // Code does fire on 2nd pass, new app/window still ignores it
        
        QApplication app(argc, argv);
        MainWindow mainWindow;
        mainWindow.show();
        exitCode = app.exec();
        //We can't change this once the app has been established.
        qputenv("QT_DEBUG_PLUGINS", "1");
        exitCode = EXIT_CHANGE_DEBUG_FLAG; //for testing only
    
    while(exitCode == EXIT_CHANGE_DEBUG_FLAG);
    return(exitCode);

应用程序确实重新启动,但它的行为不像设置了 QT_DEBUG_PLUGINS。如果我将该行移到 QApplication 上方,它总是可以工作,但我希望这是一个在运行时可用的配置选项。

我觉得我要么在尝试做不可能的事情,要么我忽略了一些愚蠢的事情。

【问题讨论】:

【参考方案1】:

您可以在程序执行的任何时候设置环境变量,进一步调用 qgetenv 将返回新值。您不必丢弃并重新创建您的 QApplication。只需在用户选择该配置选项时设置环境变量,它将在应用程序的其余执行时间内生效。

我认为您对什么是“应用程序”和什么是 QApplication 感到困惑。 QApplication 是应用程序中的一个对象。丢弃 QApplication 对象并创建一个新对象不会重新启动整个应用程序。

这可能与您的应用程序在启动时继承环境的想法有关,并且在您停止应用程序之前对应用程序外部环境的更改不会生效。但是,在这种情况下,qputenv 调用正在更新您的应用程序的环境副本。它不会改变您最初继承的外部环境。

【讨论】:

问题是有问题的环境变量似乎需要在生成 QApplication 实例之前设置它。如果我将它放在 QApplication 构造函数调用之后的任何时候,它将不起作用。如果我完全退出并销毁销毁 QApplication 并重新创建它也没关系,这让我认为 QT 在进程本身中缓存了此功能。当我说在这种情况下应用时,我并不是指 QApp 可以访问(我确实确认它是),但核心 QT 的库函数响应它的存在。 啊,我忽略了您正在尝试操作 QT 的环境变量之一,而不是您自己的环境变量。这完全有可能在 QApplication 启动时从环境中读取值,然后从那里缓存。这是有道理的,因为搜索环境比访问内部数据成员要慢得多。我检查了是否有一种方法可以即时启用调试,但我没有找到。我认为可能无法实现此功能。

以上是关于在运行时将更改环境变量应用于应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Svelte 框架:在运行时将环境变量传递给客户端包

如何在运行 CLI 和 Apache2Handler 时将系统环境变量导入 PHP?

配置JAVA的环境变量

Unix Tutorial Eight

Electron 环境变量

当环境变量更改时,让基于 makefile 的 cmake 项目自动运行 make rebuild_cache