对于通过 QProcess 启动的下载器,先构建子进程的环境,再启动它:

auto* download = new QProcess(parent);
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("https_proxy", "http://proxy.example:8080");
download->setProcessEnvironment(env);
download->start("curl", {"--head", "https://www.example.com/"});

这段 Qt 代码假定父对象已存在、事件循环可用,并且子进程能够访问 curl。运行时保持 QProcess 存活,并在应用中处理它的完成与错误信号。对于这次未配置代理凭据的公开站点检查,HTTP 代理列表 可提供候选 HTTP 端点,用于子进程的代理值。

从 systemEnvironment 出发会保留 PATH 这类继承值。若改为构建一个空环境并只添加一个代理变量,就会丢掉这些条目。

关键在于变量名。export 是一条 shell 命令,不是这个键的一部分,也不是 QProcess 必须先启动的可执行文件。直接传入环境还免去了围绕 URL 拼一条 shell 命令。

setProcessEnvironment 作用于此后启动的进程。它不会改变已在运行的子进程,也不会改变启动 Qt 应用的那个 shell 的环境。

选定的下载器必须理解这个变量。本例使用小写的 https_proxy 来满足 curl 的 HTTPS 请求,并保留继承来的绕过设置。换一个子程序,代理接口也可能不同。

相关文章