-2

私は 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] -----------

ただし、文字列を「true」と比較する if 条件に比較を追加すると、最初のスキャン条件に渡されません。

[Edit2] グローバル変数「strFirstScan」を作成するコードを次のように変更しました。

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

これで問題と私のスクリプトが解決されました。

    if ( strFirstScan == "true" ) {

動作します。

4

2 に答える 2