用QML或JavaScript调用OS环境

时间:2017-06-29 03:17:52

标签: javascript qt qml

我试图在 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 ,希望澄清问题。

3 个答案:

答案 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:

qml-snippet

答案 2 :(得分:0)

OP似乎面临两个问题:

  1. 从纯QML读取环境变量
  2. 获取系统外壳以从纯QML调用子流程

我对解决(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