相关文章推荐
细心的绿豆  ·  Python精讲 | ...·  6 月前    · 
非常酷的仙人掌  ·  Java ...·  1 年前    · 

QtScript JavaScript比较

最近测试Qt Application程序的脚本化以及与Webview的混合编程,结合原来的JavaScript集成比较了一下QtScript的实现.在比较两者异同的过程中看到了原来接触过的Node.js,于是一并复习.下面结合三者的异同说下ECMAScript,也算是近期对《Node.js开发指南》这本书的一个读书总结。
JavaScript被大家广泛认识是在浏览器端,初期用于简单的客户端页面跟新和逻辑校验(如表单有效性校验等),其大规模编程的广泛应用出现在Web2.0时代以后。拜各个浏览器飚性能这股潮流的福,目前JavaScript的运行环境近几年已经过质的变化,成为解释性语言中性能最好的一类。据统计其性能超越了php、python等其他解释性语言,距C++等编译性语言的距离也在缩小。
自JavaScript大规模编程开始后,其语言特性才被大家所认识。这里要先讲一下ECMAScript。
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)通过ECMA-262标准化的脚本程序设计语言,目前其实现形式有以下几种:JavaScript(Chrome、FireFox等浏览器),JScript(IE),QtScript(Qt4.3以后集成的开发语言),ActionScript(Flash编程)等。比较成功和应用最广的属JavaScript(简称JS),其运行环境也有很多,目前相关的处理引擎高的是Chrome的V8。 目前浏览器竞争激烈,JS引擎的性能也在不断飙高,版本和品种也在不断出新。从上个月浏览器厂商的动态可见战场之惨烈:Google宣布更新引擎到 以进一步提升Chrome性能;Opera宣布转投Webkit;Mozilla宣布。
关于各个浏览器的JS引擎介绍,大家可以参阅这里:http://www.cnblogs.com/gdutbean/archive/2012/02/21/2362003.html
这里先说下JavaScript和ECMAScript的区别。ECMAScript是一种语言标准,定义了其基本语法和语言结构;JavaScript可以理解成各个开发商对这种语言的一种实现,只不过这种实现加入了各浏览器的独有部分(BOM和DOM),来更方便的实现浏览器环境下编程。从这个意义上,JavaScript与QtScript一样,都是ECMAScript的一种方言。(当然实际情况比这个要复杂的多,有兴趣的请Google下JavaScript的历史)。
回来说一下QtScript,QtScript也是ECMAScript的一种实现.开始于集成在Qt中实在Qt V4.3版本,其运行需要libQtScript.so的支持.由于Qt语言信号和槽的实现机制,QtScript也支持这种信号与槽的关联,方便了js脚本与C++代码的交互,这一点是其他版本的ECMAScript中未实现的.由于QtScript运行在自身的QScriptEngine引擎中,其语法较常见的JavaScript语法较为严格,限制了一些不太常规的语言组织方式和使用习惯.比如,QtScript中变量必须var声明,而这点在JavaScript中并不是强制的(JS中未使用var声明的变量默认声明为全局变量).
为了后面描述JS中大量异步处理的方便,我们这里用JavaScript来模拟一下Qt的信号槽机制:
Qt中的信号槽描述如下:
QLabel  *label  = new QLabel; 
QScrollBar *scroll = new QScrollBar; 
QObject::connect( scroll, SIGNAL(valueChanged(int)), label,  SLOT(setNum(int)) );

简单起见,此处只模拟这一种连接方式.
JS中参数时灵活的,不想C++/Qt中那么严格,所以此处稍作改动.
//构建基本对象
function QObject(objInitParm){
  this.info = objInitParm;
  this.objSession = new DateTime();
//增加一个自身的信号槽维护池
QObject.connection = {};
//增加信号发射函数
QObject.prototype.signal = function(signalInfo){
  var callBacks = this.connection["signal_0"];  //QObject.getConnetctions(this.objSession);
  for(var i=0;i<callBacks.length;i++){
     callBacks[i]["slotFunc"].call(callBacks[i]["objSlot"], signalInfo);
//增加槽函数
QObject.prototype.signal = function(signalInfo){
  //do somthing with signalInfo
//增加信号与槽的关联
QObject.prototype.connect = function(objEmit, signalFunc, objSlot, slotFunc){

当然Node中也大量使用了信号或者说事件这个概念,

比较一下Qt和Node在信号/事件这方面的不同:

Qt的信号和槽,是借助编译器实现的特殊函数或代码片段,最终存在的形态是C++函数.而信号和槽的概念是Qt这一层面对C++封装和抽象的结果。Qt的信号同时存在发射者 接受者 信号类型 信号参数四个概念,在建立关联关系时这四者也同时确定,任何一个信息的变更都会影响一个关联关系的建立。特殊的,同一个信号名称,携带不同的参数类型时,响应的事件可以是不一样的。

Node中的事件,关注的是事件名称,而不太关注发射者或者触发者。也就是说在这边对应过去应该是接受者和信号类型两种属性。

未完待续。

跨平台编程的利器—Qt:与Javascript的交互[为程序添加动态脚本]一、相关类的介绍二、与脚本的交互1.从Scrip环境中返回数据2.Script环境中调用Qt环境中的函数或类3.Qt环境中调用Script环境中的数据或类 原文链接:https://blog.csdn.net/guxch/article/details/7656846 因为业务需要,作者比较关心一种语言或技术的用户自定义能力,用户自定义的“最高境界”就是能将脚本嵌入到程序中,从而改变或控制程序的运行。 从Qt4.3起,就支持脚本了,Q Qt5与Javascript交互 本文记录Qt5.7.1与JavaScript进行混合编程的例子,网上这些例子基本也是大同小异,我也是参考了网上的一些做法,但很多时候你需要自己手动做一遍才能真正理解和明白其中的过程,同时我发现有些例子的某些操作挺迷惑人——真的需要这样做吗?是否可以更加简单一点,更加清晰地描述其中的过程?下面是我经过修改的例子。 本文使用开发环境是VS2013+Qt5.7. 本篇主要对QTJavaScript的交互方法通过代码进行详细说明,实现的QT版本是 4.8.7, QT += webkit。完整代码中包含启动html调试窗口的方法。 QT中调用JS函数 // 调用js中的无参无返回值,名为QtCallNoParam的函数 ui->qwebView ->page()->mainFrame()->evaluateJavaScript(QString("QtCallNoParam()")); // 调用js中的有两个参数... 近几年PC桌面开发越来越多的被Electron,QT和Java技术占领。下面简单比较一下它们的优劣。 Electron,势是开发用时快,社区轮子多,整合一下就能用。缺点是打包大,js计算弱。 Java,优点就是java本身语言oo特性比较好,适合堆功能特别多的复杂项目,资源比较丰富,但是界面表现能力稍差,对硬件要求不太高,对一些非x86廉价硬件支持较差,与C/C++结合也会稍微麻烦一些,容易踩坑。 QT,硬件要求较低一些,可以在更廉价的各种硬件上运行,不过开发成本高一些,本身原生C/C++,比较容易扩展,        前面学习中,很多地方都用到了C++和JavaScript相互通信。今天就学习QtScript模块吧。    Qt 包含完全集成的 ECMA 标准脚本引擎。Qt Script 集成了 QObject,为脚本提供了 Qt 的信号与槽 (Signals & Slots) 机制,可在 C++ 和脚本之间进行集成。 脚本支持可使开发事半功倍,QtScript提供脚本错误报告,用户可用自己的脚本跟踪程序缺陷.   下面是一个简单的hello程序。  //main.cpp #include #incl 支持的平台HTML5的支持无处不在Qt支持所有主流平台(而且非主流平台碰巧用它做UI)理论上你可以用HTML5适配更多平台,但这不是大多数开发人员在现实世界里使用它的原因。HTML5开发者越来越多地放弃浏览器以及构建混合app。大部分移动开发者针对Android、iOS、Windows Phone和BlackBerry 10当中的几个平台开发。Qt 不仅支持这些平台,而且还支持更多。事实上,在... http://www.cnblogs.com/lomper/p/4138281.html QT中有解析Json的一个类叫QScript。貌似还有一个QJson,但听说解析的方便性不如QScript,具体没有深入探究,这里仅简单记录一下QScript的使用。 下面是debug中的结果: " billcount : 2" " bills [ " " billID : 010101001