3

我已将我的项目从 Qt 5.6.2 升级到 Qt 5.9.4 当我第一次尝试使用新的 Qt 版本构建时,在 mac 上遇到了一些问题,但没有什么大不了的。我已经合并了这些更改并切换到 Windows,以便尝试在那里构建我的项目。不幸的是,由于一些 JS 问题没有成功。

看起来 QML 的 JS 引擎在 Mac 和 Windows 上的工作方式与 Qt 5.9.4 不同(也许更早的版本也没有尝试过),然后在 Qt 5.6.2 上工作。

这是一个小例子,它展示了我的问题的根本原因:

    QtQuick.Item {
        QtQuick.Component.onCompleted: {
            function underscoreFind(obj, predicate, context) {
                var findIndex = function(obj, predicate, context) {
                    for (var i = 0; i < obj.length; i++) {
                        if (predicate(obj[i])) {
                            return i;
                        }
                    }
                    return -1;
                }

                var key = findIndex(obj, predicate, context)
                console.log("type of KEY " + (typeof key))
                console.log("KEY IS " + key)
                console.log("OBJ KEY IS " + obj[key])
                var keycheck = (key !== void 0 && key !== -1)
                if (key !== void 0 && key !== -1) {
                    console.log("#1 EVALUATING AS TRUE")
                } else{
                    console.log("#1 EVALUATING AS  FALSE")
                }
                if (keycheck) {
                    console.log("#2 EVALUATING AS TRUE")
                } else{
                    console.log("#2 EVALUATING AS  FALSE")
                }
           }
           underscoreFind([,,5], function(obj){return obj !== undefined })
       }
    }

Mac 上的输出:

qml: type of KEY number
qml: KEY IS 2
qml: OBJ KEY IS 5
qml: #1 EVALUATING AS  TRUE
qml: #2 EVALUATING AS TRUE

Windows 上的输出:

qml: type of KEY number
qml: KEY IS 2
qml: OBJ KEY IS 5
qml: #1 EVALUATING AS  FALSE
qml: #2 EVALUATING AS TRUE

以前有人遇到过这个问题吗?这里到底发生了什么?在此之后我如何信任 QML 的 JS 引擎?

最初的问题出现在我在库 .js 文件中的原始项目中。我在我的 QML 项目中使用 underscore.js 作为 .js 库,它在 Qt 5.6.2 上运行良好,在 Mac 上与 Qt 5.9.4 运行良好,但_.find(...)在 Windows 上的函数失败,它undefined总是返回。一旦我将函数重命名为_.find其他类似的名称_.underscoreFind并更改void 0检查以检查它undefined是否有效。

这是的原始实现_.find

_.find = _.detect = function(obj, predicate, context) {
      var key;
      if (isArrayLike(obj)) {
        key = _.findIndex(obj, predicate, context);
      } else {
        key = _.findKey(obj, predicate, context);
      }
      if (key !== void 0 && key !== -1) return obj[key];
  };

这是我修改后的函数,它解决了 Windows 上的问题:

_.underscoreFind = function(obj, predicate, context) {
      var key;
      if (isArrayLike(obj)) {
        key = _.findIndex(obj, predicate, context);
      } else {
        key = _.findKey(obj, predicate, context);
      }
      if (key !== undefined && key !== -1) return obj[key];
  };

编辑1:

这个问题实际上是从 Qt 5.6.3 引入的,又名 5.6.2 具有预期的行为,但 5.6.3 在上述小测试示例中已经失败。

4

0 回答 0