C 是否可以将私有数据添加到GtkWidget?

C 是否可以将私有数据添加到GtkWidget?,c,gtk,gtk2,C,Gtk,Gtk2,是否可以将私有数据添加到GtkWidget 背景: // checkbox signal callback void on_checkbox_tcoggled(GtkWidget* widget, gpointer data) { MyClass* me = data; MyPrivateData* priv = widget->priv; // ??? MyClass_foo(me, priv); } 我有许多GtkCheckBottons,所有这些小部件都

是否可以将私有数据添加到
GtkWidget

背景:

// checkbox signal callback
void on_checkbox_tcoggled(GtkWidget* widget, gpointer data) {
    MyClass* me = data;
    MyPrivateData* priv = widget->priv;  // ???

    MyClass_foo(me, priv);
}
我有许多
GtkCheckBotton
s,所有这些小部件都连接到同一个回调。在回调中,我想处理widgets私有数据(或者至少区分widgets)

示例:

// checkbox signal callback
void on_checkbox_tcoggled(GtkWidget* widget, gpointer data) {
    MyClass* me = data;
    MyPrivateData* priv = widget->priv;  // ???

    MyClass_foo(me, priv);
}
是否可以将私有数据添加到GtkWidget

您可以使用函数和将任意数据添加到任何
GObject

MyPrivateData *priv = ...
g_object_set_data(G_OBJECT(widget), "my private data", priv);

// ...

void on_checkbox1_toggled(GtkWidget* widget, gpointer data) {
    MyClass* me = data;
    MyPrivateData* priv = (MyPrivateData*) g_object_get_data(G_OBJECT(widget), "my private data");

    MyClass_foo(me, priv);
}

回调的第二个参数只是
gpointer
,而不是
gpointer*
。由于这只是一个
无效*
,演员阵容是不必要的。你是对的。从问题中复制代码时,我并没有注意到。非常感谢,我喜欢这个解决方案,效果非常好。请参阅我对@el.pescado答案的评论。您有一些错误。@请解开您是对的,谢谢!为什么不是GTKMM而是因为你将GTK(C)和C++混合?@乔尔不能使用GTKMM,因为我使用的是C编译器。C和C++在哪里混合?C库与C++混合没有错,但有GTK端口的原因。我只是作为一个替代方案,并利用GTKMM获得C++的优势。我的薪水是0.02美元。