Wt3.1.9文档翻译:Signal<A1,A2,A3,A4,A5,A6> 类模板参考,Signal<A1,A2,A3,A4,A5,A6> Class Template Reference
一个将事件传递给监听者的信号。
使用信号/信号槽来让一个对象(A)监听另一个对象(B)引起的事件。在这个情景中,对象B 在它的公有接口中暴露出一个信号,而对象A 将它的一个成员函数(充当槽的角色)连接到这个信号。接下来对象A(本座认为这里应该是B)就可以通过发射这个信号来向外宣告一个事件(它会触发所连接到的那些回调函数)。信号/信号槽是对图形界面程序中使用的流行的观察者模式的一般化。
一个信号可以使用多达6 个参数来为事件提供细节。一个信号槽必须与某个信号有相兼容的特征才能与它连接,这是根据参数来判断的。一个兼容的特征必须在成员函数中提供相同的参数,或者可以少一些(无视末尾的参数)。
当目标被删除时,信号自动与信号槽断开连接。另外,信号可在任何时候删除,甚至在它正在被发射的时候。
Signal 对象与WObject 对象整合在一起。一个Signal要求它的连接的目标,也就是监听一个事件的那个对象,必须是一个WObject。另外,每个信号都可以指定一个WObject 来作为它的所有者,而目标可以使用WObject::sender()来找出信号的发射者。
class MyWidget : public Wt::WContainerWidget
{
public:
MyWidget(Wt::WContainerWidget *parent = 0)
: Wt::WContainerWidget(parent),
done_(this)
{
…
Wt::WPushButton *button = new Wt::WPushButton(“Okay”);
button->clicked().connect(this, &MyWidget::process);
}
//为信号提供一个访问函数
Wt::Signal<int, std::string>& done() { return done_; }
private:
Wt::Signal<int, std::string> done_;
void process() {
…
done_.emit(42, “Totally done”); //发射信号
}
};
接下来,可以从另一个类中使用这个部件:
class GUIClass : public Wt::WContainerWidget
{
…
private:
void init() {
MyWidget *widget = new MyWidget(this);
widget->done().connect(this, &GUIClass::whenDone);
}
void whenDone(int result, const std::string& description) {
…
}
};
WSignalMapper是一个辅助类,在这个情况下很有用:你想要将多个信号连接到同一个信号槽,并且仍然想要使用某些属性来识别发送者。
参见:
HxLauncher: Launch Android applications by voice commands