全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Qt 脚本Qt支持应用程序利用ECMAScript编程。下面的说明涵盖了用EMCAScript和Qt编程的各个方面。脚本类下面的类可以为qt程序添加脚本的能力QScriptClass 定义qt脚本对象自定义行为的接口QScriptClassPropertyIterator 自定义qt脚本对象的迭代器QScriptContext 表示一个qt脚本函数的调用QScriptContextInfo 关于QScriptContext的其它一些信息QScriptEngine qt脚本代码执行环境QScriptEngineAgent 报告QScriptEngine执行的附属事件接口QScriptEngineDebugger QScriptEngine调试器QScriptProgram 装入一个qt脚本程序QScriptString QScriptEngine内部字符串的句柄QScriptSyntaxCheckResult 脚本语法校验结果QScriptValue qt脚本数据类型的容器QScriptValueIterator java风格的QScriptValue迭代器QScriptable 从qt的C+成员函数访问qt脚本环境脚本语言概述略基本用法要执行脚本代码,需要创建QScriptEngine并调用它的evalute()函数,将脚本代码作为参数传入。【代码】返回值时执行结果(以QScriptValue对象表示);可以被转换成标准c+和qt类型。自定义的属性通过脚本引擎注册后可以通过脚本访问。这最简单的做法是将属性作为脚本引擎的全局对象。【代码】这么做就把属性放到了脚本环境中,因此可以被脚本代码访问。时脚本引擎可以访问QObject任何派生自QObject的实例均可被脚本使用。当一个QObject传递给QScriptEngine:newQObject()函数时,创建了一个qt脚本包装对象,该对象使QObject的信号、槽、属性以及子对象均可被脚本访问。这儿有一个例子,将一个继承自QObject名为“myObject”的子类的实例被脚本代码访问:【代码】这将在脚本环境中创建一个较名为myObject的全局变量。这个变量作为潜在C+对象的代理。注意脚本变量的名称可以是任意指定,它不依赖于QObject:objectName()NewObject()函数还有另外两个可选的参数:一个是所有权模式,还有一个参数是一个选项集合,允许你控制QScriptValue如何包装QObject的特定方面。后面会回过头来介绍这些参数的使用。使用信号和槽Qt脚本引入了qt的核心信号槽机制。用qt脚本适用信号和槽有三种方法:l 混合C+/脚本:c+程序连接信号和脚本函数。脚本函数可以是,比如说,用户输入的或者从文件读入的。这种办法很有用,特别是在你有一个QObject,但是不想把他暴露给脚本环境时;你只希望脚本可以定义如何响应信号,然后在c+程序侧取建立连接。l 混合脚本/c+:脚本可以在脚本环境中暴露的预定义的对象间建立信号和槽的连接。在这种场景下,槽函数本身还是在c+程序中编写的,但是连接的定义是完全动态的(由脚本定义的)。l 完全脚本定义:脚本既可以定义信号句柄函数(),也可以利用这些句柄建立连接。比如,脚本可以定义一个函数句柄指向QLineEdit:returnPressed()信号,然后连接这个信号到脚本函数。用qScriptConnect()函数来连接C+信号和脚本函数。下面的例子定义了脚本信号处理句柄,用来处理QLineEdit:textChnaged()信号:【代码】qScriptConnect()函数的前两个参数和你传给QObject:connect()创建通常的c+连接是一样的。第三个参数是脚本对象,当信号处理函数被调用后,该对象类似this对象;上面的例子我们传入了一个无效的脚本值,因此this对象将是全局对象。第四个参数是脚本函数本身(“槽函数”)。下面的例子演示了this参数如何使用:【代码】我们创建了两个QLineEdit对象,并且定义了一个信号处理函数。连接使用了同一个处理函数,但是处理函数根据哪个对象的信号被触发而调用相应的函数,因此打印出来的内容会不同。在脚本代码中,Qt脚本使用了不同的语法来创建或者断开连接,而不是熟悉的c+语法,像QObject:connect()这样。要连接信号,你引用一个信号作为发送对象的属性,然后调用它的connect()函数。有三个重载的connect()函数,每个函数对应一个disconnect()函数。下面的章节对着三种形式作了描述:信号连接到函数Connect(function)这个形式的连接,connect()函数的参数是要连接到信号的函数。【代码】参数可以像上例这样,是一个qt脚本函数,也可以是QObject槽,就像下面的例子一样:【代码】当参数是QObject的槽时,信号和槽的参数类型不一定要匹配;qt脚本会在必要时会将信号的参数类型进行转换以匹配槽函数的参数类型。要从一个信号断开连接,你可以调用信号的disconnect()函数,将要断开的槽函数作为参数传入。【代码】当脚本函数作为信号的响应被调用时,this对象是一个全局对象。信号连接到成员函数Connect(thisObject,function)这个形式的connect()函数,第一个参数是当第二个参数指定的函数被调用时,绑定到变量this上的对象。如果你在form上有一个按钮,你通常想做一些和form有关的事情来响应按钮的点击信号,这种情况下把form作为this对象是可以的。【代码】与信号断开连接,将相同的参数传递给disconnect()即可:【代码】信号连接到有名的成员函数Connect(thisObject,functionName)这个形式的connect()函数,第一个参数是当用来响应信号的函数被调用时,绑定到变量this上的对象。第二个参数指定了连接到信号的函数名称,并且这个函数名称指向第一个参数的一个成员函数。注意函数在连接建立时resolved,不是在信号产生时.【代码】与信号断开连接,将相同的参数传递给disconnect()即可:【代码】错误处理当connect()或者disconnect()函数执行成功后,返回undefined;否则,它会跑出脚本异常。你可以从Error对象中得到异常信息。例子:【代码】从脚本中发射信号要从脚本代码中发射信号,你只需要调用信号函数,传入相应的参数即可:【代码】目前还不支持在脚本中定义新的信号;所有的信号必须在c+类中定义。重载的信号和槽当信号或槽是重载的,Qt Script会尝试基于调用函数的QScriptValue参数实际类型选择正确的重载函数。比如,如果你的类有一个槽myOverloadedSlot(int)和myOverloadedSlot(QString),下面的脚本代码会合理运行:MyObject.myOverloadedSlot(10);/执行int版的重载函数MyObject.myOverloadedSlot(“10”);/执行QString版的重载函数你可以用数组风格的属性范文指定如果重载函数的参数数量不同,Qt Script会根据实际传入参数的数量选出最匹配的重载函数。对于重载的信号,如果你试图通过名称来连接信号,Qt Script会抛出异常;你必须用全名引用访问属性QObject的属性可以作为相应Qt Script对象的属性。当你在脚本代码中使用一个属性时,c+针对这个属性的get/set方法会被自动调用。比如,如果你的c+类里有个属性定义如下:【代码】脚本代码可以像如下这样做:【代码】访问子QObjects每一个QObject的有名子类(也就是,QObject:objectName()不是空字符)默认都可以作为Qt Script的包装对象的属性。比如,如果你有一个QDialog的子窗体,子窗体的objectName属性是“okButton”,你可以在脚本代码中通过如下的表达式访问这个对象【代码】既然objectName本身是一个Q_PROPERTY,你可以在脚本代码中用这个名字,比方说,给对象重命名:【代码】你也可以用findChild()函数和findChildren()函数来查找子对象。这两个函数分别和QObject:findChild()和QObject:findchildren()完全一样。比如,我们可以通过字符串和表达式,用这些函数来找到对象:【代码】当你操作一个使用了网格布局的窗体是,你通常会想用findChild();这样的话,脚本就不需要知道控件到底在那个布局中这样的细节了。控制对象的所有权Qt Script用垃圾回收机制来回收不再使用的脚本对象的内存;在脚本环境中对象不再被任何地方引用时,内存会被自动回收。当包装的对象被回收后(不管QObject是否被删除了),Qt Script允许你控制xxx;你可以在创建对象使,将所有权模式作为QScriptEngine:newQObject()函数的第二个参数传给它来实现。了解Qt Script如何处理所有权是很重要的,因为它可以帮助你避免下述情况的发生:c+对象应当删除却没有被删除时(会导致内存泄露),或者,c+对象在不该删除的地方被删除了(通常会core)。Qt所有权默认的,脚本引擎不会得到传给QScriptEngine:newQobjec()函数的QObject的所有权;对象根据Qt的对象所有权机制(参考对象树和所有权)被管理。这个模式当,比如说,你在包装你应用程序核心部分的c+一些对象时,是合适的;这表示,脚本环境中无论发生什么,他们都应该留存。换个说法来解释就是c+对象必须在脚本引擎外部生存。脚本所有权指定QScriptEngine:ScriptOwnership作为所有权模式会使得脚本引擎对QObject拥有完全的所有权,并且可以在可行的情况下(比如在脚本代码中该对象没有其它的引用)删除它。这种所有权在如下情况是适用的,即:如果QObject没有父对象,并且/或者QObject是在脚本引擎上下文中创建的,不打算在脚本引擎外生存的对象。比如,构造函数只在脚本环境中使用是个不错的选择:【代码】自动所有权QScriptEngine:AutoOwnership 是基于QObject是否有父对象。如果Qt Script的垃圾回收器发现在脚本环境中QObject不再被引用,那么只有在QObject没有父对象,它才会被删除。其它人删了QObject会发生什么?一个包装过的QObject可能在Qt Script控制之外被删除;比如没有考虑指定所有权模式。这种情况下,包装对象仍然是一个对象(不像xxxx)。任何尝试对于这个脚本对象的访问都会抛出脚本异常。注意对于一个删除的QObject,QScriptValue:isQObject()仍然返回true,因为它测试了脚本对象的类型,不管内部指针是否为非空。换句话说,如果QScriptValue:isQObject()返回true但是Q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年莆田辅警协警招聘考试备考题库及答案详解(必刷)
- 2025年萍乡辅警协警招聘考试真题及答案详解参考
- 2025年阿里辅警招聘考试真题及答案详解(真题汇编)
- 2025年自贡辅警招聘考试真题含答案详解(新)
- 2025年黔南布依族苗族自治州辅警招聘考试题库含答案详解(综合卷)
- 2025年甘南州辅警招聘考试题库及答案详解(网校专用)
- 2025年湘潭辅警招聘考试题库附答案详解(研优卷)
- 2025年温州辅警招聘考试真题及参考答案详解1套
- 2025年莆田辅警协警招聘考试真题含答案详解(综合题)
- 2025年海口辅警协警招聘考试真题及答案详解(考点梳理)
- 初中地理综合实践作业设计方案-七年级(三)利用地球仪演示地球自转-人教版七年级上册-(学生版)
- DB61-T+1803-2023水工隧洞软弱围岩变形控制技术规范
- 餐饮连锁经营培训课件
- 数字与图像处理-终结性考核-国开(SC)-参考资料
- 3.3 燃烧条件与灭火原理课件九年级化学(科粤版2024)
- 公务员2022年国考《申论》真题及答案解析(地市级)
- 广州长隆调研报告
- 沁园春雪朗读技巧指导教案设计
- 急需学科专业引导发展清单
- 国开电大应用写作(汉语)形考任务4参考答案
- 青少年心理健康教育课件
评论
0/150
提交评论