Qt QScript 之 C++/JavaScript相互调用

文章目录

  • Qt Script
    • 什么是ECMAScript
    • Qt 中JavaScript
    • class 详解
    • Basic Usage
      • QObject对脚本引擎可用
      • 使用信号槽
      • connect 三种模式
      • 访问属性, 子对象
    • 使c++对象可用于用Qt Script编写的脚本
      • C++ 类成员函数可用于脚本
      • C++ 类属性可用于脚本
      • 对脚本中的c++对象信号的反应
    • 函数对象和本机函数
      • 从c++调用Qt脚本函数
      • this object
      • 包装本机函数
      • 形式形参和参数对象
      • 访问参数对象
      • 构造函数
      • 将数据与函数关联
      • 原生函数作为函数的参数
    • 总结

Qt Script

Qt为使用ECMAScript编写应用程序脚本提供了支持. ,可用于实现 C++应用程序和JavaScript代码之间的相互调用

还需要注意的是:
:此模块尚未积极开发。它只提供了与Qt 4的向后兼容性。对于新代码,请使用QJSEngine和Qt QML模块中的相关类。
Qt Script在Qt公司的商业许可下可用。此外,它在自由软件许可下可用。从Qt 5.4开始,这些自由软件许可证是GNU Lesser General Public License, version 3,或GNU General Public License, version 2。
此外,Qt 5.15.17中的Qt Script在以下许可许可下包含第三方模块:

JavaScriptCore, version Snapshot from 2011-01-27    GNU Library General Public License v2 or later

什么是ECMAScript

ECMAScript 是一个语言规范(Language Specification),可以理解为一种脚本语言规范。目前这个语言规范由Ecma International 这个组织在维护 。

而JavaScript 是ECMAScript 这种语言规范的一种具体实现。当前存在几种JavaScript实现,比如Apple的JavaScriptCore,Google的[v8] (https://v8.dev/)这两种是比较有名气的。

Qt 中JavaScript

QT框架中推荐使用的JavaScript引擎是JavaScriptCore,QML模块使用的JavaScript引擎就是这个版本。
在这里插入图片描述

class 详解

项目Value
QScriptClass用于定义(一类)Qt脚本对象的自定义行为的接口
QScriptClassPropertyIterator自定义Qt脚本对象的迭代器接口
QScriptContext表示一个Qt脚本函数调用
QScriptContextInfo关于QScriptContext的附加信息
QScriptEngine评估或者说是执行Qt脚本代码环境
QScriptEngineAgent用于报告与QScriptEngine执行有关的事件接口
QScriptEngineDebuggerQScriptEngine debugger
QScriptProgram封装一个Qt脚本程序
QScriptString在qscriptenengine中充当“内部”字符串的句柄
QScriptSyntaxCheckResult脚本语法检查的结果
QScriptValue作为Qt脚本数据类型的容器
QScriptValueIteratorQScriptValue的java风格迭代器
QScriptable从Qt c++成员函数访问Qt Script环境中

Basic Usage

要计算脚本代码,需要创建一个QScriptEngine并调用它的evaluate()函数,将脚本代码作为参数传递给evaluate。

QScriptEngine engine;
qInfo() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();

通过在脚本引擎中注册自定义属性,可以使脚本可用。这是通过设置脚本引擎的全局对象的属性最容易做到的:

engine.globalObject().setProperty("foo", 123);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();

QObject对脚本引擎可用

  • 任何基于qobject的实例都可以与脚本一起使用。
  • 当一个QObject被传递给QScriptEngine::newQObject()函数时,一个Qt Script包装器对象被创建,它可以用来使QObject的信号、槽、属性和子对象对脚本可用。
QScriptEngine engine;
QObject *someObject = new MyObject; //inherited from QObject
QScriptValue objectValue = engine.newQObject(someObject);
engine.globalObject().setProperty("myObject", objectValue);这将在脚本环境中创建一个名为myObject的全局变量。变量充当底层c++对象的代理。
注意,脚本变量的名字可以是任何东西;也就是说,它不依赖于QObject::objectName()newQObject()函数接受两个额外的可选参数:一个是所有权模式,另一个是一个选项集合,它允许您控制包装QObject的QScriptValue应该如何表现的某些方面。

使用信号槽

  • Hybrid C++/script:
    c++应用程序代码将信号连接到脚本函数。例如,脚本函数可以是用户输入的函数,也可以是从文件中读取的函数。如果你有一个QObject,但不想将对象本身暴露给脚本环境,这种方法很有用;您只是希望脚本能够定义应该如何响应信号,并将其留给应用程序的c++端来建立连接。

  • Hybrid script/C++
    脚本可以连接信号和插槽,以在应用程序向脚本环境公开的预定义对象之间建立连接。在这个场景中,插槽本身仍然是用c++编写的,但是连接的定义是完全动态的(脚本定义的)。

  • Purely script-defined
    一个脚本既可以定义信号处理函数(有效地“插槽写在Qt脚本”),并建立利用这些处理程序的连接。例如,脚本可以定义一个函数来处理QLineEdit::returnPressed()信号,然后将该信号连接到脚本函数。

使用qScriptConnect()函数将c++信号连接到脚本函数。

QScriptEngine eng;
QLineEdit *edit = new QLineEdit(...);
QScriptValue handler = eng.evaluate("(function(text) { print('text was changed to', text); })");
qScriptConnect(edit, SIGNAL(textChanged(const QString &)), QScriptValue(), handler);
//qScriptConnect()的前两个参数与传递给QObject::connect()以建立普通c++连接的参数相同。
//第三个参数是脚本对象,它将在调用信号处理程序时充当this对象;在上面的例子中,我们传递了一个无效的脚本值,所以这个对象将是全局对象。
//第四个参数是脚本函数(“slot”)本身
QLineEdit *edit1 = new QLineEdit(...);
QLineEdit *edit2 = new QLineEdit(...);QScriptValue handler = eng.evaluate("(function() { print('I am', this.name); })");
QScriptValue obj1 = eng.newObject();
obj1.setProperty("name", "the walrus");
QScriptValue obj2 = eng.newObject();
obj2.setProperty("name", "Sam");qScriptConnect(edit1, SIGNAL(returnPressed()), obj1, handler);
qScriptConnect(edit2, SIGNAL(returnPressed()), obj2, handler);
//我们创建了两个QLineEdit对象,并定义了一个信号处理函数。连接使用相同的处理程序函数,但是根据触发哪个对象的信号,将使用不同的this对象调用该函数,因此print()语句的输出对于每个连接都是不同的。//在脚本代码中,Qt脚本使用与熟悉的c++语法不同的语法来连接和断开信号;也就是说,QObject:: connect()。要连接到信号,需要将相关信号作为发送方对象的属性引用,并调用其connect()函数。

connect 三种模式

  • connect(function)
function myInterestingScriptFunction() {// ...
}
// ...
myQObject.somethingChanged.connect(myInterestingScriptFunction);
// myQObject.somethingChanged.connect(myOtherQObject.doSomething);//对应disconnect
myQObject.somethingChanged.disconnect(myInterestingFunction);
myQObject.somethingChanged.disconnect(myOtherQObject.doSomething);
  • connect(thisObject, function)
var obj = { x: 123 };
var fun = function() 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRMEB多店版v3.0前端技术革新与实践

摘要 随着移动互联网技术的飞速发展&#xff0c;用户对移动应用的体验要求日益提高。CRMEB多店版v3.0作为一款针对多门店管理的电商系统&#xff0c;在前端技术层面进行了全面的革新与优化。本文将从移动端UI设计、页面功能更新、DIY设计功能升级、移动端平台与门店管理、营销…

Kubernetes 系统监控Metrics Server、HorizontalPodAutoscaler、Prometheus

Metrics Server Linux 系统命令 top 能够实时显示当前系统的 CPU 和内存利用率&#xff0c;它是性能分析和调优的基本工具。 Kubernetes 也提供了类似的命令&#xff0c;就是 kubectl top&#xff0c;不过默认情况下这个命令不会生效&#xff0c;必须要安装一个插件 Metrics …

halcon程序如何导出C#文件

1.打开halcon文件&#xff1b; 2.写好需要生成C#文件的算子或函数&#xff1b; 3.找到档案-输出&#xff0c;如下图&#xff1b; 4.点击输出&#xff0c;弹出如下窗口 &#xff08;1&#xff09;可以修改导出文件的存储路径 &#xff08;2&#xff09;选择C#-HALCON/.NET &…

centos7 openssh9.7p 制作rpm包

centos7 openssh9.7p 制作rpm包 下载源码包&#xff1a;通过git开源打包源码准备编译打包环境编译打包上传rpm包到需要更新的服务器,并更新 下载源码包&#xff1a; 一般只用ssh源码就可以了 cd /root wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p…

论文《Causal Inference for Recommender Systems》阅读

论文《Causal Inference for Recommender Systems》阅读 论文概况论文动机&#xff08;Introduction&#xff09;MethodologyPreliminariesClassical Causal Inference & Causal AdjustmentDeconfounded Recommender 总结 论文概况 今天给大家带来的是发表在推荐系统顶会 …

使用Spring Boot自定义注解 + AOP实现基于IP的接口限流和黑白名单

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

IDEA启动jsp项目

1、背景 有个老项目的前端需要修改&#xff0c;整来源码之后发现是比较古老的jsp项目&#xff0c;需要在idea中启动下试试 2、代码配置流程 常规的配置流程网上都有 2.1 首先找到Project Structure 2.2 配置web.xml 注意下方的 web resource directory, web.xml中的写的相对…

Markdown 使用技巧之利用 Mermaid 进行绘制流程图

文章目录 前言一、基础语法1.1 声明图像类型1.2 声明排列方向1.3 声明节点1.4 声明节点形状1.5 声明节点间的连接1.5.1 基本连接线1.5.2 调整链接的长度1.5.3 调整链接的样式二、流程图-进阶使用2.1 自定义节点样式2.2 自定义形状大小2.3 自定义链接样式2.4 视图分组三、使用场…

校园安保巡逻机器人

2023年8月5日&#xff0c;陕西西安一高校实验室起火冒烟&#xff0c;导致学校化学实验室发生火灾。2022年8月3日&#xff0c;一名歹徒持械闯入江西吉安安福县城的一家私立幼儿园&#xff0c;对着无辜的幼儿行凶伤人&#xff0c;造成3死6伤。 像这样的事故有不断地发生&#xf…

161.二叉树:在每个树中找最大值(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题&#xff1a; 一看这不是杨氏矩阵嘛&#xff0c;接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知&#xff1a; …

python数据分析——datetime数据类型1

参考资料&#xff1a;活用pandas库 1、python的datetime对象 # 导入datetime对象 from datetime import datetime# 获取当前日期和时间 nowdatetime.now() print(now)# 手动创建datetime t1datetime.now() t2datetime(1970,1,1) # 对datetime做数学运算 difft1-t2 print(diff…

儿童节快乐!探索图形化编程桌面的“童年”成长之路

在这个充满童真与快乐的儿童节&#xff0c;我要向在CSDN平台上努力拼搏的每一位朋友&#xff0c;送上我最热切、最深情的祝福&#xff01;愿你们心中那份孩童般的纯真与对世界无尽的好奇永不褪色&#xff0c;愿你们的人生道路如同这个美好的节日&#xff0c;流光溢彩、欢乐永恒…

lynis安全漏洞扫描工具

Lynis是一款Unix系统的安全审计以及加固工具&#xff0c;能够进行深层次的安全扫描&#xff0c;其目的是检测潜在的时间并对未来的系统加固提供建议。这款软件会扫描一般系统信息&#xff0c;脆弱软件包以及潜在的错误配置。 安装 方式1 git下载使用git clone https://github…

docker compose完成简单项目部署

1. 项目环境 centos7 docker mysql redis ruoyi项目 ruoyi项目链接&#xff1a;https://gitee.com/y_project/RuoYi-Vue.git 2. 进行项目前后端代码打包 后端打包&#xff1a; 修改mysql连接的相关配置文件 RuoYi-Vue/ruoyi-admin/src/main/resources/application-dru…

浙江零排参加全国水科技大会暨技术装备成果展览会(成都)并作主论坛演讲

2024年5月13日-15日中华环保联合会、福州大学、上海大学等联合举办的2024年全国水科技大会暨技术装备成果展览会在成都顺利举办。浙江零排城乡规划发展有限公司司受邀参加&#xff0c;首日有幸听取徐祖信院士、任洪强院士、汪华林院士等嘉宾的主旨报告。主旨报告后&#xff0c;…

Java过滤特殊空格nbsp;

现象&#xff1a; 用Java处理excel文件中的以下字符串时&#xff0c;想去除此空格&#xff0c;却发现用String.trim()没有直到预期效果&#xff1a; 原因&#xff1a; 在网上找了下&#xff0c;应该是这其实是html中经常使用的一种特殊空格字符&nbsp&#xff1b; 处理&a…

第八十九周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.05.25-2024.05.31 学习产出&#xff1a; 一、论文 SAN: INDUCING METRIZABILITY OF GAN WITH DISCRIMINATIVE NORMALIZED LINEAR LAYER 将GAN与切片最优输运联系起来&#xff0c;提出满足方向最优性、可分离性和单射…

DBeaver连接Elasticsearch

一、下载DBeaver 二、连接&#xff1a; 1、一定要选择开源的 Open Distro Elasticsearch 2、填写地址&#xff1a; 3、选择“URL”&#xff0c;将https改为http 否则会报SSL错误 4、测试连接

C语言 | Leetcode C语言题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; #define max(a, b) ((a) < (b) ? (b) : (a))int maxProfit(int* prices, int pricesSize) {int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < pricesSize; i) {buy1 max(buy1, -prices[i]);sell…