ninsun的个人主页

http://www.qtcn.org/bbs/u/96534  [收藏] [复制]

ninsun

  • 6

    关注

  • 9

    粉丝

  • 61

    访客

  • 等级:侠客
  • 总积分:244
  • 男,1987-04-29

最后登录:2017-07-10

更多资料

日志

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)的返回值理论上也是一个对象, 我完全可以不通过引擎的全局对象,而是通过这次载入脚本返回的对象拿到这次脚本载入的所有函数才对... 但是我没有做过测试... 不过理论上这应该是可行的... 嗯...理论上
分类:默认分类|回复:0|浏览:2196|全站可见|转载
 

下一篇:

上一篇: Qt调用javascript初窥 (零)

Powered by phpwind v8.7 Certificate Copyright Time now is:04-29 10:37
©2005-2016 QTCN开发网 版权所有 Gzip disabled