【问题标题】:Create sigc::slot with no arguments创建不带参数的 sigc::slot
【发布时间】:2014-03-21 16:00:54
【问题描述】:

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

【问题讨论】:

    标签: c++ signals gtkmm


    【解决方案1】:

    这里不需要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 作为参数传递给连接,这会使事情更具可读性:

    _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(); });
    

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 2012-04-13
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多