QtScript 与信号槽

转载 2013年12月02日 22:33:53

QtScript 与信号槽

Qt从4.3开始, 提供了 ECMAScript 支持,QtScript 模块提供了一些让 Qt 应用程序脚本化的类. 在 Qt4 中 Webkit 与 QtScript 使用了相同的 javascript 引擎实现.(Qt5 中, javascript 引擎使用了 google 的 V8)

在 QtScript 中使用信号槽

Qt Script 可以使用Qt的核心特性: 信号槽. 信号只能存在于 C++ 的代码中, 但槽函数,以及连接的动作可以放到 javascript 中来做

  1. C++ 调用 script: 连接 C++ 代码中的信号到 script 函数上. 这个 script 函数可以是 C++ 代码中包含的 script 字符串, 也可以是从文件中读进来的. 如果不想将 QObject 对象泄露到脚本的运行环境中时, 这个方法是非常有用的. 仅仅需要在 script 代码中定义信号需要怎么被响应, 剩下的就是把连接工作放到 C++ 代码里就可以了.
  2. Script 调用 C++: script 可以连接注入到脚本环境中的 C++ 对象的信号和槽, 在这种情况下, 槽函数还是定义在 C++ 代码中, 但是信号和槽的连接完全是动态的(在 script 中完成)
  3. 纯script: script 可以定义信号的响应函数句柄, 然后使用句柄建立信号与槽的连接. 比如: script 可以定义一个函数用来响应QLineEdit::returnPressed() 信号, 然后连接信号与 script 函数.

使用 qScriptConnect() 函数连接 C++ 信号到 script 函数上. 下面的例子中, handler 用来处理QLineEdit::textChanged() 信号:

1
2
3
4
5
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() 的完全一致. 第三个参数是 script 对象, 当 signal handler 被调用时, 它充当 this 的角色. 在上面的代码中, 我们传入了一个不可用的值, 此时 this 是全局对象. 第四个参数是 script 函数, 相当于槽函数. 下面的代码展示如何使用 this 参数:

1
2
3
4
5
6
7
8
9
10
11
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() 语句输出的内容将会有所不同.

在某个项目中,设计之初曾经考虑过以下的交互方式: javascript 传入 json 对象, 其中某个 value 是匿名 function, 来实现异步调用. 这种方式看起来很美, 也与第一种方式类似, 但是存在问题. C++ 无法获得当前 webkit 的 javascript 运行环境. QtScript 曾考虑过提供 API 来访问 webkit 的 javascript 运行环境, 详细信息可以参考:https://bugreports.qt-project.org/browse/QTWEBKIT-2, 但由于种种原因最终放弃了, 不得不说这是个遗憾.

参考

相关文章推荐

QtScript

  QtScript 模块起源于 QSA,在Qt4.6时,QtScript 进行过完全重写。原来的QtScript 以 Qt Script classic的名字放到了 Qt Solutions 中。...
  • bbjjqq
  • bbjjqq
  • 2011年01月26日 10:46
  • 4319

QtScript小测

QtScript小测 //.pro QT += core gui QT += script CONFIG += uitools grea...

QT:QTScript绑定C++的几种方法

QTScript C++
  • shgaol
  • shgaol
  • 2011年01月24日 00:08
  • 2670

【深入QT】信号槽机制浅析

一、信号槽的基本概念 关于QT信号槽的基本概念大家都懂,通过信号槽机制,QT使对象间的通信变得非常简单: A对象声明信号(signal),B对象实现与之参数相匹配的槽(slot),通过调用...

QT 自定义函数 自定义信号和槽

在QT中自定义函数,信号,槽基本上都是在基类上派生时设计的 (全局变量和函数请参考http://blog.csdn.net/liang890319/article/details/7062928) ...

QGraphicsItem如何使用信号/槽

对于 QGraphicsItem 来说,信号/槽和属性机制不是它的一部分,因为它不继承自 QObject。这是一个出于性能考虑的设计决策,允许比较大的场景以及快速的交互。特殊情况下,如果真的需要使用信...

信号(Signal)与槽(Slot)-Qt中的典型机制

因为下一篇关于Boost的文章会涉及到事件处理的问题,里面用的是信号和槽的机制,先拿Qt里的这个机制预研一下。诶,Boost这是够厉害的,什么先进就包含什么!要知道我以前一直以为这是Qt的专利呢。当然...
  • wjeson
  • wjeson
  • 2012年07月02日 16:41
  • 3760

Qt信号与槽之connectSlotsByName函数

如果使用ui acton编辑器,一般在代码中找不到生成的connnect函数,即关联信号与槽的函数,那么,信号与槽是怎么样关联起来的呢? 是靠这个函数connectSlotsByName来实现的。至...

用ISO C++实现自己的信号槽(Qt另类学习)

用ISO C++实现自己的信号槽(Qt另类学习) 转载自:http://blog.csdn.net/dbzhang800/article/details/6376422   有网友抱怨:...
  • wsh6759
  • wsh6759
  • 2012年04月06日 15:13
  • 351

QT编程基础篇QT入门之Hello qt及信号与槽

QT框架式有奇趣科技公司开发的,不过现在被诺基亚收购了,QT是一个跨平台面向对象的图形用户界面框架,现在已发展到4.8版本。 本系列QT教程主要在Windows系统下以QT的IDE软件Qt Cr...
  • dnfon
  • dnfon
  • 2012年05月28日 14:28
  • 612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QtScript 与信号槽
举报原因:
原因补充:

(最多只允许输入30个字)