2016-11-18 13 views
0

Этот вопрос беспокоил меня так долго. Я все еще новичок, но я просмотрел Google и до сих пор не нашел ответа. Я только нашел ключ, и я не знал, как его реализовать.Как получить указатель на виджет другого окна из функции обратного вызова - 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». Поскольку «виджет» относится к «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, которую вы можете найти в support.c , она возвращает значение указателя виджета, заданного двумя параметрами. Первый - это указатель на виджет внутри того же дерева виджета, который вы ищете. Второй параметр - это строка, содержащая имя найденного виджета. – Elyes

+0

И к какой поддержке вы относитесь? – 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