首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在QML上使用JavaScript库

如何在QML上使用JavaScript库
EN

Stack Overflow用户
提问于 2019-04-05 17:08:52
回答 1查看 2K关注 0票数 3

我在5.12.2上使用了一些带有QML的javascript库。它们中的一些像Proj4JS一样工作。但是当我在QML中使用geographiclib.js库时,我得到了错误。如何将JavaScript库导入到QML中?

main.qml:

代码语言:javascript
复制
import QtQuick 2.12
import QtQuick.Window 2.12
import "geographiclib.js" as MyGeo
Window {
    visible: true
    width: 640
    height: 480
    Component.onCompleted: {
        var Geodesic = MyGeo.GeographicLib.Geodesic,
            DMS = MyGeo.GeographicLib.DMS,
            geod = Geodesic.WGS84;
        var r = geod.Inverse(23, 22, 44, 29);
        console.log("distance is: ", r.s12.toFixed(3) + " m")
    }
}

错误:

代码语言:javascript
复制
qrc:/geographiclib.js:3081: ReferenceError: window is not defined
qrc:/main.qml:9: TypeError: Cannot read property 'Geodesic' of undefined
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-07 18:24:27

要做到这一点,最简单的方法是让GeographicLib在全球范围内可用:

在geographiclib.js文件的末尾,更改

代码语言:javascript
复制
window.GeographicLib = geo;

代码语言:javascript
复制
this.GeographicLib = geo;

然后你可以直接使用:

main.qml:

代码语言:javascript
复制
import QtQuick 2.12
import QtQuick.Window 2.12
import "geographiclib.js" as ThenItWillBeAvailableGlobally
Window {
    visible: true
    width: 640
    height: 480
    Component.onCompleted: {
        var Geodesic = GeographicLib.Geodesic,
            DMS = GeographicLib.DMS,
            geod = Geodesic.WGS84;
        var r = geod.Inverse(23, 22, 44, 29);
        console.log("distance is: ", JSON.stringify(r))
    }
}

结果是:

代码语言:javascript
复制
qml: distance is:  {"lat1":23,"lat2":44,"lon1":22,"lon2":29,"a12":21.754466225665134,"s12":2416081.7576307985,"azi1":13.736139413215236,"azi2":17.669059640534535}

如果您根本不想更改geographiclib.js文件,则可以使用以下命令添加全局窗口对象,例如:

window.js:

代码语言:javascript
复制
this.window = this;

然后使用:

代码语言:javascript
复制
import QtQuick 2.12
import QtQuick.Window 2.12
import "window.js" as ThenWindowWillBeAvailableGlobally
import "geographiclib.js" as ThenGeographicLibWillBeAvailableGlobally
Window {
    visible: true
    width: 640
    height: 480
    Component.onCompleted: {
        var Geodesic = GeographicLib.Geodesic,
            DMS = GeographicLib.DMS,
            geod = Geodesic.WGS84;
        var r = geod.Inverse(23, 22, 44, 29);
        console.log("distance is: ", JSON.stringify(r))
    }
}

如果您不想添加任何全局变量,但您愿意编辑geographiclib.js文件,那么您可以将第68行移动到文件的顶部:

代码语言:javascript
复制
var GeographicLib = {};
/*
 * Geodesic routines from GeographicLib translated to JavaScript.  See
 * https://geographiclib.sourceforge.io/html/js/

代码语言:javascript
复制
  } else {
    /******** otherwise just pollute our global namespace ********/
    window.GeographicLib = geo;
  }
});

代码语言:javascript
复制
  } else if (typeof window === 'object') {
    /******** otherwise just pollute our global namespace ********/
    window.GeographicLib = geo;
  }
});

然后你的main.qml就能正常工作了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55531885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档