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 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序. ...
随机推荐
- HW2.4
import java.util.Scanner; public class Solution { public static void main(String[] args) { final dou ...
- centos git版本服务器配置
在服务器上安装git及做些操作 - 执行命令 ` sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-de ...
- HDU 4452 Running Rabbits (模拟题)
题意: 有两只兔子,一只在左上角,一只在右上角,两只兔子有自己的移动速度(每小时),和初始移动方向. 现在有3种可能让他们转向:撞墙:移动过程中撞墙,掉头走未完成的路. 相碰: 两只兔子在K点整(即处 ...
- PAT 1089. Insert or Merge (25)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- 【转】bootbox自定义dialog、confirm、alert样式,以及基本设置方法setDefaults中可用参数
<html> <head> <meta charset="utf-8"> <meta name="viewport" ...
- 大数据与可靠性会碰撞出什么样的Spark?
可靠性工程领域的可靠性评估,可靠性仿真计算,健康检测与预管理(PHM)技术,可靠性试验,都需要大规模数据来进行支撑才能产生好的效果,以往这些数据都是不全并且收集困难,而随着互联网+的大数据时代的来临, ...
- CALayer 的 position和anchorPoint属性
在iOS 中,UIButton.UIImage等UIView 之所以能够显示在屏幕上,是因为其内部有一个图层(CALayer).通过UIView的layer 属性可以访问这个图层: @property ...
- background-position也许你没考虑到
设置背景图片时不知你有没有遇到过背景位置的困扰,有没有深入思考过,background-position到底是什么,下面请各位看看我的理解. 简而言之就一句话,默认图片左上角居元素左上角的坐标,例如: ...
- [转]把项目从VS2005升级到VS2013
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rangercyh.blog.51cto.com/1444712/1394348 ...
- Angular和jQuery的ajax请求的差别
近期项目中使用angular,结果发现后台没法获取參数,所以,略微研究了一下两者在发送ajax时的差别. 注意angular和jquery的ajax请求是不同的. 在jquery中,官方文档解释con ...