关闭

t调用javascript初窥 (一)

479人阅读 评论(0) 收藏 举报
分类:

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
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Qt调用javascript初窥 (一)

Qt调用javascript初窥 (一) 2012-09-03 10:53 虽然标题终于写到了(一), 不过很遗憾的是这就是现阶段的最终了... 因为东西其实过少了....
  • oMingZi12345678
  • oMingZi12345678
  • 2013-08-01 09:47
  • 720

JavaScript技术初窥

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

Unity3D初窥门槛

Unity3D基础初入门20160118 课堂基本总结: Create New Project。新建项目及任何文件夹不能有汉字。 Assets文件夹:资源文件夹,项目都在这个文件夹。有很多个...
  • Jason_Ta
  • Jason_Ta
  • 2016-01-18 19:53
  • 178

Java中断初窥

在使用Linux时我们经常可以通过在终端键入 kill quit命令,来结束指定任务。那么Java怎么让一个线程停止呢。其中的一种方法就是让线程中断,什么是中断呢?      在百度百科查到的解释是:...
  • c275046758
  • c275046758
  • 2016-06-03 19:56
  • 293

log4j使用初窥

转自:http://www.cnblogs.com/eflylab/archive/2007/01/11/618001.html Log4J是Apache的一个开放源代码的项目。通过使用Log4J,程...
  • lsp1991
  • lsp1991
  • 2015-07-30 16:19
  • 233

ACM初窥门径(一)

ACM初窥门径(一) 最近已经开始做了一些简单的杭电ACM题目作为入门,当然这些问题所涉及到的解题思路是非常简单的,算法也没有什么特别大的难度,主要的问题还是在于输入和输出的格式上的问题,然...
  • CrazyOnes
  • CrazyOnes
  • 2017-07-05 23:44
  • 111

初窥arm仿真器

转载自 http://www.ednchina.com/ART_8800512537_29_0_TA_728ce0ec.HTM
  • lock1501
  • lock1501
  • 2014-09-06 15:01
  • 692

JAVA初窥:RMI

Java的远程方法调用 (Remote Method Invocation,RMI)技术,能够帮助我们实现:某一个Java虚拟机上的对象可以调用另一台计算机、另一个Java虚拟机上面的对象的方法,就像...
  • pengjunlee
  • pengjunlee
  • 2017-06-05 22:26
  • 10227

Redis初窥:常用命令

Redis常用命令
  • pengjunlee
  • pengjunlee
  • 2017-12-17 16:33
  • 49

Swift初窥--综述

Swift是什么? Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序。在设计Swift时.就有意和Objective-C共存,Objective-C是Ap...
  • xunyn
  • xunyn
  • 2014-06-25 18:40
  • 2729
    个人介绍
    个人资料
    • 访问:2310276次
    • 积分:26889
    • 等级:
    • 排名:第244名
    • 原创:81篇
    • 转载:1891篇
    • 译文:1篇
    • 评论:134条
    最新评论