t调用javascript初窥 (一)

转载 2013年12月03日 14:33:12

Qt调用javascript初窥 (一)

2012-09-03 10:53
虽然标题终于写到了(一), 不过很遗憾的是这就是现阶段的最终了...
因为东西其实过少了...
好吧, 先上代码:
  1. QFile _scriptFile(":/res/encodePass.js");
        if (!_scriptFile.open(QIODevice::ReadOnly))
        {
            m_encodePassword.clear();
            qWarning() << "encodePass.js open failed";
            return;
        }
        QTextStream _stream(&_scriptFile);
        QString _contents = _stream.readAll();
        _scriptFile.close();
        QScriptEngine _engine;
        QScriptValue _js = _engine.evaluate(_contents);
        QScriptValue _passwordEncoding = _engine.globalObject().property("passwordEncoding");
        QScriptValueList _args;
        _args << QScriptValue(m_password) << QScriptValue(m_vCode.toUpper()) << QScriptValue(verifycodeHex);
        m_encodePassword = _passwordEncoding.call(QScriptValue(), _args).toString();
其中需要解释的, 就是流程和思维方式了...
首先, Qt调用JavaScript的流程就是:
1. 拿到脚本, 储存在一个QString对象内. 这一步可以通过读文件, 手写脚本, 或者其他任意可以得到一个QString对象的方法获得
2. 创建QScriptEngine对象
3. 使用evaluate函数载入这个脚本(QString对象)
4. 调用globalObject().property("js内的某个函数名称")函数, 来获取你想要调用的, 存在于js脚本内的函数
例如:
  1. _engine.globalObject().property("passwordEncoding");
就是我想调用刚刚载入的脚本文件里面的, 作为全局函数的 passwordEncoding 函数.
注意: globalObject()的作用, 是取得载入的脚本中的全局对象, 而所有js脚本内的全局函数都属于这个对象...这就是为什么要先获得全局对象了...
而property函数是取得函数的某个属性... 不过托无类型的js脚本的福... 一个函数完全可以当做一个属性来用... 或者说 函数和属性是等价的...
5. 取得了这个函数以后(以QScriptValue类型的返回值的形式), 就可以调用这个函数对象的call函数, 来实现这个函数的调用.
注意, 这个函数的第一个参数, 是作为函数内部的"this指针"的, 也就是说, 这个函数会按照this->函数()的方式来调用. 一般情况下, 在不深入了解的情况下, 传进去一个空构造的QScriptValue一般就行了, 这样就可以无视this指针了...
6. 调用函数是需要参数的, 也就是说call函数的第二个参数就是js脚本执行的函数的参数. 注意上面的代码, 参数是通过一个类型为QScriptValueList的对象传进去的. 这其实是一个标准QList对象, 数据类型是QScriptValue. 想要传入诸如QString之类的参数的话, 只能通过QScriptValue的构造函数构造一个传进去了. 例如代码中的_arg << QScriptValue(m_password) << ...
7. call函数的返回值依旧是一个QScriptValue, 这个值就是js函数的返回值了. 你应该知道这是什么类型的, 所以, 简单的用toXXX()函数就可以获得你想要的类型了...
思维方式的话...
就是把脚本里的一切都当成对象来处理
脚本载入以后的本身是个对象
一个变量是个对象
一个函数是个对象
这个对象的类型就是QScriptValue
既然是对象, 那么对象就会有属性
而属性也是对象
脚本载入以后, 就可以拿到它的全局对象_engine.globalObject(), 从这里应该就能拿到尊在于脚本中的一切对象
不过, 因为一切都是对象的缘故, 实际上, _engine.evaluate(_contents)的返回值理论上也是一个对象, 我完全可以不通过引擎的全局对象,而是通过这次载入脚本返回的对象拿到这次脚本载入的所有函数才对... 但是我没有做过测试... 不过理论上这应该是可行的... 嗯...理论上
举报

相关文章推荐

javascript--Cookie初窥

Cookie -js

JavaScript技术初窥

我的上个博客提到了JavaScript技术, 首先学习JavaScript编程语言,需要知道它也是W3C组织制定的编程规范。因此学习JavaScript依然使用的W3C的手册。与上个blog中提到的h...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

spark初窥

spark入门级介绍

Spring初窥(一)

applicationContext.xml 小记

Libgdxi引擎初窥(一)

http://code.google.com/p/libgdx/Libgdxi引擎是一个跨平台的游戏开发库包含了android和桌面平台两个版本本文章主要描述Libgdxi引擎的一个简单搭建流程并且最...

初窥gdb - 02

回顾上一期:《初窥gdb - 01》点击打开链接 上一期我们学习了设置断点和观察点的基本用法,这次让我们更熟悉他们。 关键命令:1. b    2. watch 新命令: 1. start  2...

初窥OpenGL Shaders

我们现在大部分人在使用 OpenGL 的时候用的是古老的 OpenGL 固定功能流水线接口。然后,现代的 GPU,包括移动 GPU 都具有可编程特性,并且大部分都具有统一着色单元,使得 OpenCL ...

初窥JAXB

概念 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例...

Hadoop初窥

Hadoop初窥 Hadoop历史         雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工...

React Native项目初窥(一)

上一篇介绍了React Native开发环境搭建 编辑器或者是编译器IDE,这里推荐使用WebStorm,官方网站下载安装,可免费使用30天 WebStorm的基本配置请参考博客:http://bl...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)