2016-11-18 57 views
0

这个问题一直困扰着我这么久。我仍然是一个初学者,但我通过谷歌看,仍然无法找到答案。我只发现了一条线索,我不知道如何实现它。如何从回调函数获取另一个窗口的窗口小部件的指针 - GTK - C

假设您打开了两个顶级窗口。你点击其中一个按钮,你想要摧毁另一个窗口。

这是我的第一个非功能性的解决方案:

Void on_button1_clicked (GtkWidget *widget, gpointer user_data) 
    { 
     GtkWidget *window2; 

     window2 = lookup_widget (widget, "window2"); 
     gtk_widget_destory (window2); 
    } 

那么,它没有工作。我明白“lookup_widget”函数并不在与包含“button1”的窗口关联的树层次之外。因为“widget”指的是“button1”。 所以,我想我会得到“window1”的指针,并使用它,而不是思考window1是在一个更高的层次结构。

GtkWidget *window1; 
    GtkWidget *window2; 
    window1 = lookup_widget (widget, "window1"); 
    window2 = lookup_widget (window1, "window2"); 
    gtk_widget_destroy (window2); 

而令我惊讶的是它没有工作。这也可以说是关于改变其他窗口的标签,因为我无法在信号事件发生的窗口之外找到窗口小部件的指针。

伙计们,我需要帮助!

+0

什么是'lookup_widget()'? – andlabs

+0

@andlabs它是一个gtk函数,您可以在支持中找到它。c 它返回给定两个参数的小部件的指针值。第一个是指向您正在寻找的小部件的同一树内的小部件的指针。第二个参数是一个包含要找到的小部件名称的字符串。 – Elyes

+0

你指的是哪一个support.c? – andlabs

回答

1

没有完整的代码很难正确回答。但是,根据您提供的信息,我的方法是使用user_data来保留要在回调中销毁的窗口的引用。

像这样:

GtkWidget *window2; 
// Get the reference of your window here 
button = gtk_button_new_with_label("Window destroy button"); 
g_signal_connect (button, "clicked", G_CALLBACK (on_button1_clicked), window2); 

然后,你的回调应该是这样的:

void on_button1_clicked (GtkWidget *widget, gpointer user_data) 
{ 
    GtkWidget *window2; 

    window2 = (GtkWidget*)user_data; 
    gtk_widget_destory (window2); 
} 
+0

非常感谢!这是我寻找的难题。我测试了它,它工作。 – Elyes

相关问题