c++ - 创建不带参数的 sigc::slot

标签 c++ signals gtkmm

我正在尝试将超时处理程序连接到我的 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::bindsigc::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/

相关文章:

java - 如何用Java实现Chebyshev Type 2 LPF?

c++ - 如何在 QT 中跟踪发射信号?

c++ - GTKmm 为什么 signal_hide() 信号没有正确发出?

c++ - 在 gtk 文本字段中交换背景颜色 (gtkmm C++)

c++ - 关于 if-else 的愚蠢 C++ 问题

c++ - Makefile:无规则可作为目标

C++:抓取文件的每个字符,忽略换行符和空格

C++ 显式构造函数和强制转换

c - 有人有非异步安全信号处理程序死锁的示例吗

c++ - Gtk 进度条高度