QJSEngine глобальное сравнение строк - PullRequest
0 голосов
/ 28 декабря 2018

Я использую 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] -----------

Я никогда не вижу «Первое сканирование» итипы переменных остаются строковыми, поскольку они не попадают в операторы 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 голосов
/ 28 декабря 2018

Я изменил свой код, который создает глобальную переменную 'strFirstScan', чтобы:

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

Теперь это решает проблему, и мой сценарий:

if ( strFirstScan == "true" ) {

Это решает проблему, и этосейчас работает.

0 голосов
/ 28 декабря 2018

Судя по выводу вашей программы, 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");

Почему именно ваш код ведет себя так, как он работает, однако невозможно сказать по тому, что вы предоставили.

...