2011-12-17 20 views
1

私は現在、GtkListViewとボタン付きの1つのウィンドウで構成されるGTKアプリケーションを作成しています。ユーザーがボタンを押すと、新しいデータを挿入してリストに追加できるようなフォームが表示されます。一時的にコンテナを他のコンテナに置き換えてください

フォームの新しいウィンドウを開く代わりに、GtkListViewを一時的に置き換えてください。私はGTKの新機能ですから、これを行うための慣習的な方法があるかどうかを知りたいと思います。

私の現在の推測では、リスト用とフォーム用の2つの非表示のタブが付いたノートブックを追加する必要があります。ボタンを押すたびに、私は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; 
} 

これは役に立ちます。

関連する問題