QML 中的 Qt.include
2016-02-27 11:32
549 查看
QML 中的 Qt.include
这个函数是在一个JavaScript文件中直接包含其他
JavaScript文件的函数。
[code]//~ stdio.js function printf(str) { console.log(str); } var std = new Object(); std.name = "stdio::std"
[code]//~ main.js Qt.include("./stdio.js"); function main() { printf("this prinft function was define in stdio.js"); printf(std.name); // 这里可以直接使用 stdio.js 文件中的 std 对象。 }
如上所示,被包含的
JavaScript中的对象名,函数名等,会直接归纳到
main.js中。
假设还有一个
foo.js文件导入了
mian.js,由于
main.js中
include了
stdio.js,所以
foo.js即可以访问
main.js中定义的对象和方法,又可以访问
stdio.js中定义的方法和对象。及
Qt.include的语义和
C/C++的
include指令类似的。
[code]//~ foo.js Qt.include('main.js'); main(); printf("call stdio::printf from foo.js");
注意:如果
stdio.js声明为静态库,既文档开头有
.pragma library。如果以
Qt.include的方式进行导入,则静态库声明失效,会重复加载。如果在
JavaScript中以
.import的方式加载,就会保持
stdio.js的静态性。
如果在
main.qml中使用
import导入
main.js,也是可以访问到
stdio.js里面的对象的。
[code]//~ main.qml import QtQuick 2.0 import "main.js" as Main Item { Component.onCompleted: { console.log(Main.std.name); } }
在 JavaScript 中实现宏操作
由于Qt.include会将目标代码的直接复制到调用的地方,语言与
C/C++类似。所以可以使用
typeof FunctionName == 'undefined'来仿制宏。
先来看看代码:
[code]//~ A.js Qt.include("./B.js"); function A() { console.log("i'am A: printf B", B) }
[code]//~ B.js Qt.include("./A.js"); function B() { console.log("i'am B: printf B", A); }
当
A.js与
B.js相互引用时,程序是无法加载这些代码的。他们之间相互包含。
根据
include的语义,使用函数名是否等于
undefined来判断是否加载了某个对应的
js文件。
注意,使用函数名来处理更好,因为函数名是定义行为,而对象名是执行行为,既在执行
Qt.include这个操作前,函数定义已经完成,而对象名定义未完成。
而且对象名需要赋值(执行行为)才可以有意义,否则对象的默认值是
undefined。
修改如下:
[code]//~ A.js console.log("start----A:") if(typeof B == "undefined") { console.log("A will include B"); Qt.include("./B.js"); } function A() { console.log("i'am A: printf B", B) } A(); console.log("end----A:")
[code]//~ B.js console.log("start----B:") if(typeof A == "undefined") { console.log("B will include A") Qt.include("./A.js"); } function B() { console.log("i'am B: printf B", A); } B(); console.log("end----B:")
相关文章推荐
- Qtcreator中经常使用快捷键总结
- 在ubuntu系统安装配置QT
- win7下安装QT开源库qwt
- 五子棋评分表算法
- QT自定义窗口标题栏实现拖动双击放大缩小
- [视觉算法] 妙算上cuda、opencv以及qt的配置
- qt线程,线程池用到的一点问题
- pyqt中使用matplotlib绘制动态曲线
- Qt国际化
- Qt遍历控件
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt::WA_DeleteOnClose 造成的野指针问题
- Qt5中用QLCDNumber显示时间
- QT 为按钮添加事件
- QT SSL OpenSSL https
- Qt 5.4错误"qt.network.ssl: QSslSocket: cannot call"
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- Qt tip——初始化窗体Geometry()
- Qt查找子窗口