QJSEngine全局字符串比较

时间:2018-12-28 10:02:18

标签: c++ qt qjsengine

我使用Qt 5.11.2,在我的应用程序中使用QJSEngine,在我的示例中我有一个脚本:

    function connect() {
        console.info("-----------");
        if ( strFirstScan.localeCompare("true") == 0 ) {
            console.info("First scan");
            strFirstScan = "false";
            a = eval(a);
            b = eval(b);
            c = eval(c);
        }
        console.info("strFirstScan: " + strFirstScan + ", typeof: " + typeof strFirstScan); 
        console.info("a: " + a + ", typeof: " + typeof a);
        a++;
        console.info("b: " + b + ", typeof: " + typeof b);
        console.info("c: " + c + ", typeof: " + typeof c);
        console.info("-----------");
    }

我已将此脚本连接到应用程序中的按钮,当我单击按钮时,脚本会调用connect()函数。我已经注册了一些用于脚本的全局变量:

    strFirstScan = "true"
    a = 123
    b = "Hello"
    c = {"a":1,"b":"A","c":{"aa":1}}

单击按钮时脚本应用程序的输出为:

    2018-12-28 09:55:10.079663+0000 XMLMPAM[2470:247691] [js] -----------
    2018-12-28 09:55:10.079718+0000 XMLMPAM[2470:247691] [js] strFirstScan: "true", typeof: string
    2018-12-28 09:55:10.079742+0000 XMLMPAM[2470:247691] [js] a: 123, typeof: string
    2018-12-28 09:55:10.079775+0000 XMLMPAM[2470:247691] [js] b: 'hello', typeof: string
    2018-12-28 09:55:10.079804+0000 XMLMPAM[2470:247691] [js] c: {"a":1,"b":"A","c":{"aa":1}}, typeof: string
    2018-12-28 09:55:10.079832+0000 XMLMPAM[2470:247691] [js] -----------

我从没见过“ First Scan”,并且变量类型仍然是字符串,因为它没有到达eval语句。

为什么比较不起作用?我尝试了多种选择:

    if ( strFirstScan == "true" ) {

    if ( strFirstScan.compare("true") == 0 ) {

这些都不是更好,为什么比较不起作用?

[编辑]我已将脚本修改为:

    function connect() {
        console.info("-----------");
        if ( typeof strFirstScan == "string" ) {
            console.info("First scan");
            console.info("strFirstScan: " + strFirstScan + ", typeof: " + typeof strFirstScan); 
            strFirstScan = 0;
            a = eval(a);
            b = eval(b);
            c = eval(c);
        }
        console.info("a: " + a + ", typeof: " + typeof a);
        a++;
        console.info("b: " + b + ", typeof: " + typeof b);
        console.info("c: " + c + ", typeof: " + typeof c);
        console.info("-----------");
    }

使用这样的脚本,我在输出中得到以下内容:

    2018-12-28 10:22:31.267553+0000 XMLMPAM[2993:335615] [js] -----------
    2018-12-28 10:22:31.267595+0000 XMLMPAM[2993:335615] [js] First scan
    2018-12-28 10:22:31.267629+0000 XMLMPAM[2993:335615] [js] strFirstScan: "true", typeof: string
    2018-12-28 10:22:31.267804+0000 XMLMPAM[2993:335615] [js] a: 123, typeof: number
    2018-12-28 10:22:31.267832+0000 XMLMPAM[2993:335615] [js] b: hello, typeof: string
    2018-12-28 10:22:31.267877+0000 XMLMPAM[2993:335615] [js] c: [object Object], typeof: object
    2018-12-28 10:22:31.267897+0000 XMLMPAM[2993:335615] [js] -----------

但是,如果我在if条件中添加了任何比较,则将字符串与“ true”进行比较,如果没有传递到第一个扫描条件中。

[Edit2]我将创建全局变量'strFirstScan'的代码修改为:

    pobjScriptEng->globalObject().setProperty("strFirstScan", QJSValue("true"));

现在可以解决问题和我的脚本:

    if ( strFirstScan == "true" ) {

工作。

2 个答案:

答案 0 :(得分:1)

根据程序输出,strFirstScan不是true,而是"true"

您可以通过在日志输出中在其值周围添加一些引号来进行验证。即:console.info("strFirstScan: '" + strFirstScan + "', typeof: " + typeof strFirstScan);

以下是演示您的问题的代码段:

var yourCase = '"true"';
console.info('value: ' + yourCase + ', type: ' + typeof yourCase + ', len: ' + yourCase.length);
console.info(yourCase === "true");

var youWant = 'true';
console.info('value: ' + youWant + ', type: ' + typeof youWant + ', len: ' + youWant.length);
console.info(youWant === "true");

为什么您的代码的行为完全正确,但是从您提供的内容中无法分辨出来。

答案 1 :(得分:0)

我将创建全局变量'strFirstScan'的代码修改为:

pobjScriptEng->globalObject().setProperty("strFirstScan", QJSValue("true"));

现在可以解决问题和我的脚本:

if ( strFirstScan == "true" ) {

这可以解决问题,并且现在可以正常工作。