【发布时间】:2020-07-30 18:12:55
【问题描述】:
我有一个类似于下面的结构
struct dc_callback
{
int
my_configure_event(
GtkWidget *widget,
GdkEventConfigure *event,
struct LoadData *myData)
{
...others
return TRUE;
}
//Parametrized Constructor
int
my_draw(
GtkWidget *widget,
cairo_t *cr,
struct LoadData *myData)
{
...others
return TRUE;
}
};
它有两个参数化的成员函数,我打算第 n 次从 g_signal_connect 调用它们。
main(){
int i;
dc_callback dc_callback_instance[nth];
for(i=0;i<nth;i++){
g_signal_connect(widget_list[i],"draw",G_CALLBACK(dc_callback_instance[i].my_draw),myData);
g_signal_connect(widget_list[i],"configure-event",G_CALLBACK(dc_callback_instance[i].my_configure_event),myData);
}
}
但是,在编译期间,我收到有关无效使用成员函数 int dc_callback::my_draw(args) 的错误。它要求我添加 () 但这无法完成,因为 G_CALLBACK 接受没有附加参数的函数名称。
我该怎么做?
【问题讨论】:
-
回调不是这样工作的,回调是指向函数的指针。如果您需要自定义每个回调的行为,请使用 user_data(在您的情况下为 myData)
-
@Nico238 虽然适用,但回调需要为您想要的每个行为提供一个独特的函数,这可能听起来不寻常,那么这可能是一个错误,这就是为什么我需要通过一个独特的函数使用结构。
-
@JamesGuana 我肯定会理解您所说的“回调需要针对您想要的每个行为的唯一函数”的意思。当您连接回调时,您必须提供一个函数指针( dc_callback_instance[i].my_draw 不是)。您可以通过为每个具有相同功能的 wigdet 提供不同的用户数据来为每个小部件设置不同的行为
-
嗨,是的,我们这样做了,但它不起作用,它注册了所有小部件的最后一个行为。我认为这是一个错误。我相信你是在这里帮助我们的最佳人选gitlab.gnome.org/GNOME/gnome-system-monitor/merge_requests/…