我试图在 QML 和 JavaScrip 中调用操作系统环境变量,但我找不到任何内容溶液
我通常在python中做的事情,我启动一个命令行并澄清一个变量:
set MY_PATH="C:/ProjectB"
然后在同一命令行中我执行Python并像这样调用变量:
>>> import os
>>> print os.environ.get("MY_PATH")
C:/ProjectB
它在Python案例中完美运行,但我如何在QML或Javascript中实现相同的功能?
注意:我只限于使用这两种语言而且不支持C ++。
编辑:我正在使用QML创建自定义界面和javascript来编写插件的第三方应用程序,没有编译器来编译C ++ ,所以我仅限于使用 QML 和 javascript ,希望澄清问题。
答案 0 :(得分:0)
如果您不能使用C ++解决方案,那么您只希望在第三方应用程序或Qt中直接实现它。
目前在QML中无法做到这一点。
答案 1 :(得分:0)
如果你可以通过Qt.openUrlExternally(url target)
调用Python脚本,可以获得env值。然后使用XMLHttpRequest
读取文本文件。 github:https://github.com/qyvlik/readenv4qml,
Qt.openUrlExternally('read_env_value_and_write_value_to_file.py');
readFileAsync('env_val.txt');
一些代码:
function setHeader(xhr, headers) {
//"Content-Type":"application/x-www-form-urlencoded"
for(var iter in headers) {
xhr.setRequestHeader(iter, headers[iter]);
}
}
function ajax(method, url, headers, data, callable) {
headers = headers || {};
callable = callable || function(xhr) {
console.log(xhr.responseText);
}
var xhr = new XMLHttpRequest;
xhr.onreadystatechange = function() {
callable(xhr);
};
xhr.open(method, url);
setHeader(xhr, headers);
if("GET" === method) {
xhr.send();
} else {
xhr.send(data);
}
}
function readFileAsync(file, callable, error) {
callable = callable || function(fileContent) {
console.log("fileContent size: ", fileContent.length);
}
error = error || function(e) {
console.log("readFileAsync error : ", e);
}
ajax("GET", file, {}, "", function(xhr){
if(xhr.status !== 200) {
error("file "+file + " not exist!");
} else {
callable(xhr.responseText);
}
});
}
REF:
答案 2 :(得分:0)
OP似乎面临两个问题:
我对解决(2)没有任何想法,但是我发现了多种解决问题的方法(1)。
要解决从QML读取环境变量的问题,我知道这两种方法基于:(a)利用QML引擎的内部内置代码,该代码可以处理指定的一小部分环境变量内部和/或(b)使用Qt.application
全局QML变量访问Qt.application.arguments
对于像我这样首先使用qmlscene
开发QML代码的人来说,好消息是,这两种方法都可以在qmlscene
下启动以及启动已编译的Qt / QML应用程序时起作用。
如果只需要使用环境变量作为简单的布尔标志,则可以“劫持”由QML引擎内部处理的built-in Qt Quick Environment Variables中的一个。
例如,如果您在启动QML应用之前执行此操作:
export QT_QUICK_CONTROLS_MATERIAL_ACCENT="#0B610B"
然后在您的QML代码中,您可以使用以下表达式进行检测:
import QtQuick.Controls.Material 2.12
// ....
readonly property color sentinelColor: "#0B610B"
visible: Material.accent == sentinelColor
在前面的代码段中,如果如图所示导出了环境变量,则visible
将被设置为true
,否则将被设置为false
。
这里是指向full working sample QML application using this tactic的链接。
使用Qt.application.arguments
的方法与此类似。启动应用程序时,请在命令行中提供一些flag参数:
./myapp -e
或者使用qmlscene时类似:
qmlscene -I ../../libstyles/imports/ -e main.qml
然后,以QML代码:
import QtQml 2.15
// .....
visible: Qt.application.arguments.includes('-e') // toggle visibility via CLI arg