这是一个用来从 JavaScript 中调用C++的信号。
JSignal 、与 EventSignal 类似,提供咯从JavaScript 向C++代码通信的事件。然而 ,它并没有与内置的事件绑定起来 。而是在自写的JavaScript 代码中使用Wt.emit()这个JavaScript 函数来发射 。
这个信号是以一个 WObject 的作用 域内的一个唯一的名字 或者是 一个唯一的全局名字 (在你的 WApplication 中声明那个信号) 来标识的 。
这个信号支持多达6 个参数。这些参数的 值可在JavaScript 函数Wt.emit() (或者是已过气的全局函数WtSignalEmit())中指定 。
示例代码:
class MyWidget : public WCompositeWidget
{
public:
MyWidget()
: doSome_(this, "doSome")
{
...
}
JSignal<std::string, int>& doSome() { return doSome_; }
private:
JSignal<std::string, int> doSome_;
...
};
下面的JavaScript 代码会为一个叫做element 的对应于一个MyWidget 类的部件的DOM 元素发射上面的信号:
Wt.emit(element, 'dosome', 'foo', 42);
element 可以是以下东西之一:一个 DOM元素 ; 一个 WObject 的 对象标识符 ;常量'Wt' ,它是'WtWApplication::instance()-> id() '的别名 。那些JavaScript 参数 (ax)与C++的Ax 类型的变量之间的转换是使用 boost::lexical_cast<Ax>(ax) 来进行的。
你可以使用createCall()方法来让那个信号自己来为你生成JavaScript 调用:
doSome_.createCall("'foo'", "42");
由createCall()生成的JavaScript 可能会被信号的每次连接或断开动作影响 。在实际使用过程中,你应当在一个部件内部使用 JSignal ,并且只在你将内部的信号 槽与信号连接咯之后才调用 createCall() 。
还可以将一个原始的JavaScript 事件以WMouseEvent 或WKeyEvent 的类型作为最后一个参数传递出去。在那种情况下,Wt.emit()中的第二个参数必须是一个指示JavaScript 事件和事件目标的对象。
看看下面这个信号声明:
JSignal<std::string, int, WMouseEvent> doSome();
然后,下面的JavaScript 调用就是合适的 :
Wt.emit(Wt, {name: 'dosome', event: event, eventObject: object}, 'foo', 42);
createEventCall()方法可以针对这个JavaScript 方法调用的变种来使用。
由于从JavaScript 到C++的转换是使用boost::lexical_cast<T>(arg)来进行的,所以你可以通过为你的自定义类型实现c++输入流操作符 operator<< (std::istream&, T& t) 的方式来为自定义类型提供支持。
参考 :
WWidget::jsRef() 、 WObject::id()
HxLauncher: Launch Android applications by voice commands