2009-11-16 2 views
1

다음 코드/함수를 사용하여 GtkScrolledView에 구성 요소 목록을 추가하고 있습니다.GtkScrolledWindow에 GtkVBox 구성 요소를 추가하는 중 문제가 발생했습니다.

는 먼저 GtkScrolledWindow하기는 GtkVBox과는 GtkVBox에 (그것에서의 GtkLabel + GtkImage으로) GtkButton 추가 :이 함수 member_name_list_vbox에서

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); 

} 

가 GtkSrolledWindow 첨가지고는 GtkVBox 포인터를 보유 반원이다.

그러나 문제는 함수가 일부 외부 이벤트에서 n 번 호출된다는 것입니다.

그리고 모든 위젯을 제거하고 다시 추가하여 전체 목록을 새로 고쳐야합니다.

어떻게하면됩니까?

나는 내 구성원 GtkVBox g_object_unref(G_OBJECT(member_name_list_vbox));을 unref하려고 노력했다.

(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 

을 그리고 난 새로운는 GtkVBox를 작성하기 전에하지 unref는 GtkVBox을 할 경우 GtkScrolledWindow로는 GtkVBox를 추가하는 동안, 나는 오류를 얻을 : 그러나 함수가 2 시간에 호출 될 때 런타임 오류를주고있다.
기능 2 시간에 호출되는 실행 시간 오류 :

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

어떤 사람은이 문제와 도움을 제공 할 수 있습니까?

+0

편집에 관해서는; 마침표의 무작위 순서를 사용하지 말고 적절한 영어 구두점을 사용하십시오.
태그 사용을 중지하십시오. 공백 라인을 원하면 빈 라인을 사용하고, 태그는 필요하지 않습니다. 질문 텍스트에 적어도 하나 이상의 * 질문 *과 그 뒤에 물음표가 포함되도록하십시오. – unwind

+0

그래, 내가 처리 할 것이다. – User7723337

답변

1

gtk_widget_destroy으로 바꾸면 GtkVBox 위젯을 참조 해제하고 파괴하므로 저에게 효과적입니다!

1

임의로 오브젝트를 참조 해제하지 마십시오. 모든 종류의 혼란이 야기됩니다. 스크롤 된 창에서 중 VBOX를 제거

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

이 따라서 그것을 파괴, 총 참조 카운트가 0이 될하게한다 vbox에,하는 컨테이너의 참조를 제거합니다. 이렇게하면 모든 하위 위젯이 재귀 적으로 삭제됩니다. 이 호출 후 vbox에 대한 포인터는 더 이상 유효하지 않으므로 NULL로 설정할 수 있습니다.

+0

새 vBox를 만들기 전에 gtk_container_remove를 추가했습니다. 그리고이 오류가 발생했습니다 : (응용 프로그램 : 8957) : Gtk-CRITICAL ** : gtk_container_remove : 어설 션'GTK_IS_TOOLBAR (container) || 위젯 -> 부모 == GTK_WIDGET (컨테이너) '실패했습니다 – User7723337

+0

응? 마치 GTK +가 컨테이너 (vbox)를 부모로 간주하는 것처럼 보입니다. 그렇게해서는 안됩니다. GTK + 소스 코드를 편리하게 사용할 수는 없지만, GTK +에서 예상치 못한 오류가 발생하면 코드를 읽습니다. 여기 뭔가 다른 점이 있다고 생각합니다. 스크롤 된 창에서 vbox를 제거하면 실제로 작동 할 것으로 예상됩니다. 이상한. – unwind

+0

하지만 예상대로 작동하지 않습니다. ( – User7723337

관련 문제