我尝试将超时处理程序连接到我的gtkmm代码,如gtkmm book所示。但是,我的特定on_timeout()函数不需要任何参数,我正在努力正确创建一个sigc::slot
对象以传递给connect
函数,因为我遇到以下内容错误(等等):
error: no matching function for call to ‘bind(sigc::bound_mem_functor0<bool, DerivedWindow>)
和几个
candidate expects 2 arguments, 1 provided
指的是sigc::bind
。我如何调用这两个函数:
_timeout_slot = sigc::bind(sigc::mem_fun(*this,&DerivedWindow::on_timeout));
_connection = Glib::signal_timeout().connect(_timeout_slot,timeout_value);
我是在DerivedWindow
派生的班级Gtk::Window
上执行此操作的。我究竟做错了什么?如果我不需要任何参数,是否需要使用sigc::bind
和sigc::mem_func
?
答案 0 :(得分:2)
此处不需要sigc::bind
,因为您没有绑定任何其他参数的插槽(处理取消引用this
的成员函数指针已由sigc::mem_fun
处理)。所以,这就足够了:
_timeout_slot = sigc::mem_fun(*this, &MyWindow::on_timeout)
_connection = Glib::signal_timeout().connect(_timeout_slot, timeout_value);
快速提示:如果你可以使用C ++ 11,你可以将lambdas作为参数传递给connect,这样可以使事情更具可读性:
_connection = Glib::signal_timeout().connect([this]{ return on_timeout(); }, timeout_value);
为此,您可能需要添加
namespace sigc{
SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
}
此外,如果您想连接到类实例的信号(比如Gtk::Button* btn
),您可以通过定义宏来使事情变得更紧凑
#define CONNECT(src, signal, ...) (src)->signal_##signal().connect(__VA_ARGS__)
然后允许你写
CONNECT(btn, clicked, [this]{ btn_clicked_slot(); });