Qt 之 QtScript
前言
前面学习中,很多地方都用到了C++和JavaScript相互通信。今天就学习QtScript模块吧。
Qt 包含完全集成的 ECMA 标准脚本引擎。Qt Script 集成了 QObject,为脚本提供了 Qt 的信号与槽 (Signals & Slots) 机制,可在 C++ 和脚本之间进行集成。
脚本支持可使开发事半功倍,QtScript提供脚本错误报告,用户可用自己的脚本跟踪程序缺陷.
代码
简单代码
QScriptEngine类为程序提供一个嵌入式脚本环境。一个应用程序中可以添加多个脚本引擎;
每一个引擎都是一个轻量级自包含的虚拟机。通过调用脚本引擎的evaluate()函数可以执行脚本.
事例1
QScriptEngine engine;
QScriptValue result = engine.evaluate("(3*2)-1");
qDebug() << "Result: " << result.toInt32();
事例2
QScriptEngine engine;
QScriptValue func = engine.evaluate("(function(a, b) { return a+b;})");
QScriptValueList args;
args << 1 << 2;
QScriptValue result = func.call(QScriptValue(), args);
qDebug() << "Result: " << result.toInt32();
QScriptValue是一个Qt Script数据类型的容器,支持ECMA-262定义的类型,如:
原始数据类型:Undefined,Null,Boolean,Number,String,对象类型。
另外Qt Script还内建支持QVariant,QObject和QMetaObject.
对于基对象(object-based)类型(包括Date和RegExp),使用
QScriptEngine对象的newT()函数(如QScriptEngine::newObject())创建一个你期望的QScriptValue类型。对于原始数据类型,直接使用
QScriptValue构造函数加载。
isT()方法能够被用来测试一个值是否是你确定的数据类型。
toT()方法用来将QScriptValue转换成其他类型。当然你也可以用qscriptvalue_cast()方法.
复杂代码
下面是一个简单的hello程序。
记住还需要在.pro文件中加入:QT += script
//main.cpp
#include <QtGui/QApplication>
#include <QMessageBox>
#include <QtScript/QtScript>
#include <QPushButton>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(helloscript);
QApplication app(argc, argv);
QScriptEngine engine;
//国际化
QTranslator translator;
translator.load("helloscript_la");
app.installTranslator(&translator);
engine.installTranslatorFunctions();
QPushButton button;
QScriptValue scriptButton = engine.newQObject(&button);//生成C++对象的代理脚本对象
engine.globalObject().setProperty("button", scriptButton);//将对象注册到javascript
//读取js文件
QString fileName(":/helloscript.js");
QFile scriptFile(fileName);
scriptFile.open(QIODevice::ReadOnly);
QString contents = scriptFile.readAll();
scriptFile.close();
QScriptValue result = engine.evaluate(contents, fileName);//执行脚本
if(result.isError())
{
//解析js文件是否有错误
QMessageBox::critical(0, "Hello Script",
QString::fromLatin1("%0:%1: %2")
.arg(fileName)//文件名
.arg(result.property("lineNumber").toInt32())//错误行号
.arg(result.toString()));//错误信息
return -1;
}
return app.exec();
}
//helloscript.js
button.text = qsTr('Hello World');//note that the qTr() function is used to allow for translation
button.styleSheet = 'font-style: italic; color: #12FF12';
button.show();//调用show()槽函数
button.clicked.connect(
function(){
print('Hello QtScript');
}
);
屏幕截图

Blog from sollyu
Qt 之 QtScript的更多相关文章
- Qt之QtScript(一)
C++和JavaScript相互通信.今天就学习QtScript模块吧. Qt 包含完全集成的 ECMA 标准脚本引擎.Qt Script 集成了 QObject,为脚本提供了 Qt 的信号与槽 (S ...
- Qt与JS(三)
Qt不错的学习网址: http://www.cnblogs.com/findumars/p/5529526.html ----------------------------------------- ...
- Qt 6.0精简WebEngine SerialPort Multimedia等成为半残GUI框架一览
由于 Qt 集成了大量成熟模块,使之成为 C++ 领域中最好用的开源技术跨平台 GUI 开发框架.基于 Qt 能开发 Windows MacOS 传统桌面或无 GUI 应用程序.Unix/Linux ...
- 夺命雷公狗---node.js---3commonJs 与 nodeJs的简介
JavaScript是一个强大面向对象语言,它有很多快速高效的解释器.官方JavaScript标准定义的API是为了构建基于浏览器的应用程序.然而,并没有定于一个用于更广泛的应用程序的标准库. Com ...
- Qt编程之QtScript
需求是这样的: 需要给一个硬件接口测试些东西,用js来调用,js做成不同的独立模块分别测试不同的硬件接口,包括DMD内存,PCIE带宽等等.需要用一个exe来载入这些js文件分别调用测试模块.exe用 ...
- Qt4学习笔记 (7) 本篇说一下Qt对于脚本的支持, 即QtScript模块.
本篇说一下Qt对于脚本的支持, 即QtScript模块. Qt支持的脚本基于ECMAScript脚本语言, 这个东西又是javascript, jscript的基础. 所以, 一般只要学过javasc ...
- linux(debian) arm-linux-g++ v4.5.1交叉编译 embedded arm 版本的QtWebkit (browser) 使用qt 4.8.6 版本
最近需要做一个项目 在arm 架构的linux下 没有桌面环境的情况下拉起 有界面的浏览器使用. 考虑用qt 的界面和 qtwebikt 的库去实现这一系列操作. 本文参考: Qt移植到ARM Lin ...
- Qt *.pro编写一般规则
qmake 之 CONFIG 与 QT 乱谈 看qtcn论坛中经常有人忘记 QT+=network 等语句.随便写写吧,或许对他人有帮助. 写来写去,发现越写越乱,就这样吧,反正主要的内容很简单. d ...
- Qt简介
一.Qt与Qt Creator简介 Qt是一个跨平台应用程序和 UI 开发框架.使用 Qt 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序. ...
随机推荐
- 【转】终于知道为什么我的mysql总是卸载的不干净以及老是找不到my.ini文件
感谢博主: http://blog.sina.com.cn/s/blog_6fc5bfa90100qmr9.html 如果你的电脑里装过MySQL,想再重新安装MySQL的时候可能就会因为前一版本卸载 ...
- 打开链接(C# / 默认浏览器)
System.Diagnostics.Process.Start("http://www.baidu.com/");
- windows 7 下安装 IIS 和 ArcGis Server 9.3 遇到的问题及解决方法
windows 7 下安装 IIS 和 ArcGis Server 9.3 遇到的问题及解决方法 分类: ArcGIS server 计算机2012-07-31 14:17 631人阅读 评论(0) ...
- JSON ,JSONArray和JSONObject
和 XML 一样,JSON 也是基于纯文本的数据格式.由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,可以用 JSON 传输一个简单的 String,Num ...
- Yii2 多域名跨域同步登录退出
在平台开发过程中,项目分为前台(frontend)www.xxx.com和后台(backend) yun.xxx.com两部分,绑定两个域名, 我们知道在没有绑定域名的时候前后台可以同步登录和退出,但 ...
- 传值(VIP)
页面间传值主要分为:1.属性传值.2.协议传值.3.单例传值.4.Block传值: 界面之间的传值: 1.从前往后:属性传值 2.从后往前:代理传值 3.多界面之间的传值 — 单例传值 ...
- 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏
C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...
- careercup-排序和查找 11.1
11.1 给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B.编写一个方法,将B合并入A并排序. 解法: 已知数组A末端有足够的缓冲,不需要再分配额外空间.程序的处理逻辑很简单,就是逐一比 ...
- gallery左右滑动时图片淡入淡出
前几天,公司项目有一个功能要做成滑动图片的淡入淡出,要一边滑动一边改变,所以ViewFlipper左右滑动效果就不能了.网上找了很久,也找不到资料,所以自己写了一个,通过滑动改变imageView的透 ...
- ODB 下载与安装 (Linux)
http://www.codesynthesis.com/products/odb/download.xhtml Installing ODB on UNIX Introduction This gu ...