当年学微软的MFC时,被它用一大堆宏实现的事件处理机制困惑了很久;然后学习java,觉得java的事件处理机制不错,addlistener,多简 单多直观啊;再后来接触QT,用预处理的方式扩展c++的语义,实现了类似java的signal和slot机制,啧啧,也很清爽,就是稍微有点麻烦,而 且集成在qt内部,没法单独拿出来用,qt那么大一坨可不方便。
今天我要给大家介绍的这个东东就了不得了,它单单利用c++的泛型就实现了signal+slot的消息处理机制。虽然泛型颇让俺们这些c++菜鸟有点怕怕,但实际上这个库用起来简单到都快不值得写文档了。废话说这么多下面就介绍它是怎么用的。
比如偶有一个类,say,一个按钮Button吧。然后又有一个类叫MainFrame。我现在想让一个Button实例button被点击时 MainFrame实例mainFrame中的一个成员函数handleButton会被触发。我可以这样定义Button和MainFrame
class Button {
public:
....
sigc::signal clicked;
....
protected:
....
OnClicked(){ clicked.emit(this); }
};
class MainFrame{
public:
....
void handleButton(Button× pButton);
....
};
然后在某处有类似这样的一段代码:
sigc::signal::iterator iter;
iter = button.clicked.connect(sigc::mem_fun(&mainFrame, &MainFrame::handleButton));
这么一来,当button被点击时,mainFrame的handleButton函数就会被调用。如果有button1,button2,也可以这么联 结。这样mainFrame.handleButton就会处理多个Button的clicked事件,这时它可以通过pButton参数来判断到底是哪 个按钮被点击了。 而一个signal也可以同时联接到多个处理函数上。并且你还可以在运行中解除这种联结。上面代码中的iter就是干这个用的。
iter.disconnect();
哇,怎么样,相当的灵活吧。能拿来做什么就看各位的想象力了,gtk的C++版本就是利用它实现的,见gtkmm 。
先就写这么多了,算是抛砖引玉,各位想用又有什么不明白就去看sigc++的文档好了。
没有评论:
发表评论