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 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序. ...
随机推荐
- 【解决】exited with a non-zero exit code 1
安装好集群后运行hadoop-mapreduce-examples.jar 报错,比对cdh配置后,发现少了yarn.application.classpath,conf目录一定要配置,否则也会出 ...
- 如何把.rar文件隐藏在一个图片内
首先假设我们要隐藏的.rar文件叫a.rar,图片叫a.jpg.先把他俩放到同一个目录下,然后通过“cmd”进入windows命令行,进入目标目录下,使用以下命令进行隐藏: copy/B a.jpg ...
- (太强大了) - Linux 性能监控、测试、优化工具
转: http://www.vpsee.com/2014/09/linux-performance-tools/ Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的还是那些久经 ...
- JavaScript Garden
Objects Object Usage and Properties Everything in JavaScript acts like an object, with the only two ...
- hdoj 1253 胜利大逃亡
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu4433 locker
暴力dp.. dp[i][j][k] 表示 前i位完全匹配 j 表示i+1位 k表示i+2位 枚举j k #include<iostream> #include<cstdio> ...
- Android框架结构图
- jetbrains
于最新jetbrains发布了IntelliJ IDEA 15. PyCharm 5.PhpStorm10.WebStorm 11等各个版本,但是改变了注册方法.原先的注册码包括注册机都已经不能使用了 ...
- 【转】在Windows下搭建React Native Android开发环境
http://www.jianshu.com/p/2fdc4655ddf8 安装JDK 从Java官网下载JDK并安装.请注意选择x86还是x64版本. 推荐将JDK的bin目录加入系统PATH环境变 ...
- iOS开发中WebP格式的64位支持处理
几个月前我们项目中添加了对webp格式的处理.期间遇到了一些问题,这是当中的一个小的记录. 官方下载地址:https://code.google.com/p/webp/downloads/list 对 ...