2011-12-17 3 views
1

현재 하나의 창에 GtkListView 버튼과 버튼으로 구성된 GTK 앱을 작성하고 있습니다. 사용자가 버튼을 누르면 새로운 데이터를 삽입하여 목록에 추가 할 수있는 형태가 나타납니다.임시로 컨테이너를 다른 컨테이너로 바꿉니다.

양식의 새 창을 여는 대신 GtkListView을 임시로 바꾸고 싶습니다. 저는 GTK를 처음 접했기 때문에이를 수행하는 관용적 방법이 있는지 알고 싶습니다.

내 현재 짐작되는 것은 두 개의 숨겨진 탭 (목록과 양식 중 하나)이있는 노트북을 추가해야한다는 것입니다. 버튼을 누를 때마다 focus-tab 신호가 발생하여 양식 탭으로 전환됩니다.

GtkListView을 임시로 바꿀 수있는 더 좋은 방법이 있습니까?

답변

2

임시 위젯을 만들 수있는 노트북이 필요하지 않습니다, 당신은 내가 사용하는 것은 다음은 간단한 상자 를 사용할 수 있습니다 완벽하게

# displaying the list view 
    container = gtk.VBox() 
    container.add(tree_view) 

    # removing the treeview and adding a form 
    container.remove(tree_view) 
    container.add(form) 
    form.show() 
+0

작품, 감사합니다! – Philip

2

단추의 콜백에 gtk_container_add & gtk_container_remove을 사용하여이 작업을 수행 할 수 있습니다. 첫 번째보기를 컨테이너에 추가하십시오. 사용자가 단추를 클릭하면 첫 번째보기 &을 제거하고 다음 단추를 추가하십시오. 그 반대. 위젯에 대한 참조가 컨테이너 &에서 제거되면 위젯이 삭제되므로 컨테이너에 추가하기 전에 위젯에 대한 참조를 추가해야합니다. 다음은 샘플은 참조를 위해 C에 :이 도움이

#include <gtk/gtk.h> 

static GtkWidget *view0; 
static GtkWidget *view1; 
static GtkWidget *frame; 
static int current_view_id; 

static GtkWidget * 
create_view0 (void) 
{ 
    GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); 
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), 
        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 
    GtkWidget *view0_content = gtk_label_new ("Here is first view"); 
    gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW 
        (scrolled_window), view0_content); 
    gtk_widget_show_all (scrolled_window); 
    return scrolled_window; 
} 

static GtkWidget * 
create_view1 (void) 
{ 
    GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); 
    GtkWidget *view1_content = gtk_label_new ("Here is next view"); 
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), 
        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 
    gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW 
        (scrolled_window), view1_content); 
    gtk_widget_show_all (scrolled_window); 
    return scrolled_window; 
} 

static gboolean 
change_view (GtkWidget * button, gpointer data) 
{ 
    (void) data; 

    if (current_view_id == 0) 
    { 
     gtk_button_set_label (GTK_BUTTON (button), "Prev"); 
     gtk_container_remove (GTK_CONTAINER (frame), view0); 
     /* Need to add reference as container will own widget ref */ 
     /* If gtk_container_remove is called with widget's last ref, widget is destroyed */ 
     g_object_ref (view1); 
     gtk_container_add (GTK_CONTAINER (frame), view1); 
     current_view_id = 1; 
    } 
    else 
    { 
     gtk_button_set_label (GTK_BUTTON (button), "Next"); 
     gtk_container_remove (GTK_CONTAINER (frame), view1); 
     /* Need to add reference as container will own widget ref */ 
     /* If gtk_container_remove is called with widget's last ref, widget is destroyed */ 
     g_object_ref (view0); 
     gtk_container_add (GTK_CONTAINER (frame), view0); 
     current_view_id = 0; 
    } 

    return FALSE; 
} 

int 
main (void) 
{ 
    GtkWidget *window; 
    GtkWidget *vbox; 
    GtkWidget *label; 
    GtkWidget *button; 

    gtk_init (NULL, NULL); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); 

    vbox = gtk_vbox_new (FALSE, 5); 
    gtk_container_add (GTK_CONTAINER (window), vbox); 

    frame = gtk_frame_new (" Sample for view change "); 
    view0 = create_view0(); 
    view1 = create_view1(); 

    /* Need to add reference as container will own widget ref */ 
    /* If gtk_container_remove is called with widget's last ref, widget is destroyed */ 
    g_object_ref (view0); 
    gtk_container_add (GTK_CONTAINER (frame), view0); 

    label = gtk_label_new ("View change sample"); 
    button = gtk_button_new_with_label ("Next"); 
    g_signal_connect (button, "clicked", G_CALLBACK (change_view), NULL); 
    gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); 
    gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); 
    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); 
    gtk_widget_show_all (window); 

    gtk_main(); 
    return 0; 
} 

희망!

관련 문제