2009-11-16 3 views
1

У меня есть следующий код/​​функция, которая добавляет список компонентов в GtkScrolledView.Проблема при добавлении компонента GtkVBox в GtkScrolledWindow

Это первый добавляет GtkButton (с GtkLabel + GtkImage в нем) к GtkVBox и GtkVBox к GtkScrolledWindow:

void displayTestNameList() 
{ 
    // Get Scrolled Window from Builder. 
    GtkWidget *scrolled_window = GTK_WIDGET(gtk_builder_get_object(myBuilder, "scrolled_window_name_list")); 
    GtkWidget *vBox, *image, *button, *hbox, *label; 

    // Delete Old List --> Error On This Line 
    if(member_name_list_vbox) 
     g_object_unref(G_OBJECT(member_name_list_vbox)); 

    //Create new GtkVBox to display name list 
    member_name_list_vbox = gtk_vbox_new(FALSE, 0); 

    for(int loopIndex = 0; loopIndex < member_list.size(); loopIndex++) 
    { 
     button = gtk_button_new(); 

     gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); 
     gtk_button_set_focus_on_click(GTK_BUTTON(button), FALSE); 
     gtk_button_set_alignment(GTK_BUTTON(button), 0, 1); 

     // Attache call back signal. 
     g_signal_connect(button, "event", G_CALLBACK(cb_user_options), NULL); 

     // Set Presence Status icon 
     hbox = gtk_hbox_new(FALSE, 0); 
     gtk_container_add(GTK_CONTAINER(button), hbox); 
     image = gtk_image_new_from_file("icon.png"); 

     // Create Label 
     label = gtk_label_new(NULL); 
     gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); 
     gtk_misc_set_alignment(GTK_MISC(label), 0, 1); 
     gtk_misc_set_padding(GTK_MISC(label), 10, 2); 
     markup = g_markup_printf_escaped ("<span foreground='#151B54'><b>%s</b></span>", (const char*)(member_list[loopIndex].name)); 
     gtk_label_set_markup(GTK_LABEL(label), markup); 
     g_free (markup); 

     // Create Custom Composite GtkButton Widget (GtkImage+GtkLabel) 
     gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, TRUE, 0); 
     gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); 

     // Add this to Class Member GtkVBox 
     gtk_box_pack_start(GTK_BOX(member_name_list_vbox), button, FALSE, FALSE, 0); 
    } 

    // Add GtkVBox To GtkScrollWindow 
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
              member_name_list_vbox); 

    //Show Scrolled Window 
    gtk_widget_show_all(scrolled_window); 

} 

В этой функции member_name_list_vbox является членом класса, который имеет указатель на GtkVBox который становится добавленным в GtkSrolledWindow.

Но проблема в том, что функция вызывает несколько внешних событий (я) n раз.

И мне нужно обновить весь список, удалив все виджеты и добавив их снова.

Как я могу это сделать?

Я попытался удалить GtkVBox g_object_unref(G_OBJECT(member_name_list_vbox));, который является моим членом. Но это дает ошибку во время выполнения, когда функция вызывается второй раз:

(App:7614): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `(null)' 
(App:7614): GLib-GObject-CRITICAL **: g_signal_emit_valist: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed 
(App:7614): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `(null)' 
(App:7614): GLib-GObject-CRITICAL **: g_signal_handlers_destroy: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed 

И если я не UNREF GtkVBox перед созданием нового GtkVBox, я получаю Ошибка при добавлении GtkVBox к GtkScrolledWindow.
Время работы Ошибка при функция вызывается второй раз:

(App:8618): Gtk-CRITICAL **: gtk_scrolled_window_add_with_viewport: assertion `GTK_BIN (bin->child)->child == NULL' failed 

Может кто-нибудь предоставить некоторую помощь в этом вопросе?

+0

Что касается вашего редактирования; прекратите использовать случайные последовательности периодов, попробуйте использовать правильную английскую пунктуацию. Прекратите использовать тег
; используйте пустую строку, если вы хотите пустую строку, не нужны теги. Попытайтесь включить хотя бы один правильный * вопрос *, с вопросительным знаком после него, в свой текст вопроса. – unwind

+0

Хорошо, я позабочусь об этом. – User7723337

ответ

1

Замените g_object_unref на gtk_widget_destroy, который отключит и уничтожит виджет GtkVBox, и это сработало для меня!

1

Не произвольно не ссылайтесь на объект, который вызовет всевозможные путаницы. Удалите VBox из прокручивать окна:

gtk_container_remove(GTK_CONTAINER(scrolled_window), member_name_list_vbox); 
member_name_list_vbox = NULL; 

Это удалит ссылку контейнера на VBox, что должно привести к ее общее количество ссылок на стали 0, тем самым разрушая его. Это приведет к рекурсивному уничтожению всех дочерних виджетах. После этого вызова указатель на vbox больше не действует, и поэтому мы можем установить его в NULL.

+0

Добавил gtk_container_remove перед созданием нового vBox. И получение этой ошибки: (Приложение: 8957): Gtk-CRITICAL **: gtk_container_remove: утверждение 'GTK_IS_TOOLBAR (container) || widget-> parent == GTK_WIDGET (контейнер) 'не удалось – User7723337

+0

А? Это выглядит так, как если бы GTK + рассматривал ваш контейнер (vbox) как родительский. Это не должно быть возможным. У меня нет исходного кода GTK +, обычно в случаях, когда я получаю непредвиденную ошибку из GTK +, я читаю код. Я думаю, что здесь что-то не так, я бы действительно ожидал, что это сработает, если вы удалите vbox из прокрученного окна. Странный. – unwind

+0

Но он не работает так, как мы ожидаем :( – User7723337

Смежные вопросы