我正在尝试将超时处理程序连接到我的 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);
我在派生自 Gtk::Window
的类 DerivedWindow
上执行此操作。我到底做错了什么?如果我不需要任何参数,是否需要使用 sigc::bind
和 sigc::mem_func
?
最佳答案
这里不需要 sigc::bind
,因为您没有将任何附加参数绑定(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,则可以将 lambda 作为参数传递给 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(); });
关于c++ - 创建不带参数的 sigc::slot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22563621/