创建不带参数的sigc::slot
Create sigc::slot with no arguments
我正在尝试连接超时处理程序到我的gtkmm代码,如gtkmm书中所示。但是,我的特定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
,因为您没有将任何额外的参数绑定到插槽(处理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(); });
相关文章:
- Qt的slot(?)将冗余命名空间插入连接
- Qt单选按钮仅在实际选中按钮时调用SLOT()
- "Static polymorphism with Qt signal/slot: What is wrong?"
- C++ sigc::mem_fun 中的“呼叫不匹配”错误
- 当Qt-Slot位于通过std::async创建的线程上时,它不会被调用
- QT 请求"QObject::connect: No such slot BackEnd::RequestReceived"
- 将 Lambda 与 SIGC 库结合使用
- QObject::connect not connecting signal to slot
- 将参数传递给QT设计器构建的slot函数
- 如何将变量从main传递到signal和slot宏
- QSortFilterProxyModel and the slot setFilterFixedString
- 如何从QListView的SIGNAL/SLOT传递/检索参数
- sigc::mem_fun并从类方法传递params
- 在哪里声明从Qt SIGNAL/SLOT返回的对象
- Qt - "No such slot" ,虽然有
- 在另一个类中指定SLOT
- 如何获取哪个QradioButton调用SLOT
- 函数指针作为SLOT参数
- 带有lambda的sigc++给出错误:void值没有被忽略
- 创建不带参数的sigc::slot