将Gtk Widgets的结构传递给回调函数

时间:2014-11-03 16:10:48

标签: c gtk

我在C中创建一个GTK +应用程序,我需要从回调函数中销毁一个小部件(例如:一个按钮)。当我打电话给" gtk_widget_destroy"从该功能,小部件不会被销毁,我看到以下警告:

(gtkTest:9150): GLib-GObject-WARNING **: invalid uninstantiatable type 'GInterface' in cast to 'GtkObject'

(gtkTest:9150): Gtk-CRITICAL **: IA__gtk_widget_destroy: assertion 'GTK_IS_WIDGET (widget)' failed

如何从回调函数中访问按钮小部件?我认为唯一的选择就是让这个小部件全球化。非常感谢任何帮助。

代码段如下:

typedef struct {
    GtkWidget *button;
} buttonInfo;


/*call back function */
static gpointer _callBackFunc (buttonInfo *buttonTable)
{
    /*do some stuff*/
    gtk_widget_destroy(buttonTable->button);
    //
    return(NULL);
}

/*main*/
int main( int argc, char *argv[])
{

    GtkWidget *testButton;

    buttonInfo *buttonPTR;
    buttonPTR = g_new(buttonInfo,1);
    testButton = gtk_button_new_with_label("Click Me");
    buttonPTR->button = (GtkWidget *) testButton;

    g_signal_connect(G_OBJECT(testButton),"activate",
                     G_CALLBACK(_callBackFunc),buttonPTR);
    /*This works */
    //gtk_destroy_widget(buttonPTR->button);
} 

1 个答案:

答案 0 :(得分:2)

您的回调函数签名必须与您在信号documentation中看到的签名相匹配。在“激活”的情况下,它应该是

static void _callBackFunc (GtkButton *button, gpointer user_data)
{
    buttonInfo *button_info = (buttonInfo *)user_data;

    // ...
}

那就是说,当你检查签名时,请阅读其余的激活信号文档:它可能不是你想要使用的信号(见“点击”)。