|
在gtkmm的官网有个gtkmm学习文档.看到timouts时..借用它的部分代码.也跟着示例做了一下..但编译时在此句出错
sigc::slot<bool> my_slot = sigc::bind(sigc::mem_fun(*this,&TimerExample:n_timeout), m_timer_number);
//on_timerout回调函数
//int m_timer_number
但如果编译文档提供的代码却不会出现问题
最开始.无论我怎么修改这句.都过不去.去网上查sigc::slot 和sigc::bind却没有找到有用的信息.无奈之下.把官方提供的代码全部复制.进行修改.经过简化.和测试.终于找到问题所在.问题出在以下几个函数上.
sigc::bind 绑定: 是把此函数的最后一个参数(m_timer_number)的值传递给sigc::mem_fun连接的函数(on_timeout).所以.我们的函数就须要一个参数.
sigc::slot<bool> 这是什么我现在还不太明白.但它须要我的函数(on_timeout)返回一个参数.我试了下.什么参数都行.不返回也没关系.只是函数声明和定义里有返回类型就可以了.sigc::slot<bool>里的bool也可以换.但不能为void 和NULL.至于为什么我就不知道了.希望高手指点
所以.我们的回调函数就应该是这样的
class {
bool on_timeout(int time_numbs);
};
之后.开始正式连接
sigc::connection conn = Glib::signal_timeout().connect(my_slot, timeout_value);
//my_slot 参看第一个代码
//int timeout_value 间隔时间
这里就很简单了.这里要说的是.当我们的回调函数(on_timeout)不须要参数时.我们可以省略sigc::slot 直接在my_slot位置换上sigc::mem_fun().
sigc::mem_fun: 绑定指定类的指定函数
sigc::ptr_fun 绑定函数
sigc::bind可能是组某函数指定参数
sigc::slot包装sigc::bind的.<不知道理解的对不对>
至此.我的理解也结束了.现在并不太明白sigc里面是做什么的.望有人指定一二 |
|