2017-11-20 16 views
1

私のコードのgtk-扱うイベント

#include <gtk/gtk.h> 
    #include <glib.h> 
    #include <stdlib.h> 
    GtkWidget *scrolledwindow; 

    struct param 
{ 
    GtkWidget*parent; 
    GtkWidget*newChild; 
}; 
GtkWidget * init_tree(); 
GtkWidget * init_tree2(); 
static void destroy(GtkWidget *widget, gpointer data) 
{ 
    gtk_main_quit(); 
} 

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) 
{ 
     struct param* parameters = (struct param*)user_data; 
     gtk_container_remove(GTK_CONTAINER(parameters->parent), (GtkWidget*)tree_view); 
     gtk_container_add(GTK_CONTAINER(parameters->parent), init_tree2()/*parameters->newChild*/); 
} 


    GtkWidget * init_tree() 
    { 

     GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING); 
     GtkTreeIter treeiter; 

     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 
    GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore)); 

     GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new(); 

     GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions", 
                        cellrenderertext, 
                        "text", 0, 
                        NULL); 
     gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn); 

     return treeview; 
    } 

    GtkWidget * init_tree2() 
    { 

     GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING); 
     GtkTreeIter treeiter; 

     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "a", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "b", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "c", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "d", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "e", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "f", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); 
    gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); 
     gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); 

    gtk_list_store_append(liststore, &treeiter); 
     gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 

     GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore)); 

     GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new(); 

     GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions", 
                        cellrenderertext, 
                        "text", 0, 
                        NULL); 
     gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn); 

     return treeview; 
    } 

    int main(int argc, char *argv[]) 
    { 
     gtk_init(&argc, &argv); 

     GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
     gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); 
     g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL); 

     GtkWidget *notebook = gtk_notebook_new(); 
     gtk_container_add(GTK_CONTAINER(window), notebook); 


     int count; 
     gchar *text; 

     for (count = 1; count <= 5; count++) 
     { 
      GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); 
      text = g_strdup_printf("Page %d", count); 
    GtkWidget *label = gtk_label_new(text); 
      GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL); 

      gtk_widget_set_size_request(scrolledwindow, -1, 200); 

      gtk_container_add(GTK_CONTAINER(vbox), scrolledwindow); 
      GtkWidget *textview = gtk_text_view_new(); 
      /* gtk_container_add(GTK_CONTAINER(scrolledwindow), textview); */ 
      GtkWidget* treeview = init_tree(); 
      GtkWidget* treeview2 = init_tree2(); 
struct param* parameters = malloc(sizeof(struct param)); 
     parameters->parent = scrolledwindow; 
     parameters->newChild= treeview2; 
      g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab),(gpointer)parameters); 
      gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); 

      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); 
     } 

     gtk_widget_show_all(window); 

     gtk_main(); 

     return 0; 
    } 

を次のように私はtreview1とtreeview2 2つのliststoreインスタンスを持っています。 第1ツリービュー1が表示されます。リストストア項目をダブルクリックすると、「行起動」信号が生成されます。この信号は関数 "replace_tab"とG_CALLBACKでリンクされています。 func "replace_tab"は、親ウィジェット、親から削除するウィジェット、親とgpointerデータに追加するウィジェットの4つのパラメータをとります。この関数に引数を渡す方法。または、ソリューションのための他の方法があります。

+0

[「row_activated」信号](https://developer.gnome.org/gtk3/stable/GtkTreeView.html#GtkTreeView )。パラメータはGTKがコールバックを呼び出す際に提供されます。ところで、あなたのループで両方のtreeviewsを5回作成します。 – Gerhardh

+0

プロトタイプは user_function(GtkTreeView * tree_view、 GtkTreePath *パス、 GtkTreeViewColumn *コラム、 gpointerのUSER_DATA)次に、どのようにこの関数に親ウィジェットと次の子ウィジェットを渡すために無効となりますか? –

+0

'g_signal_connect'の間に' user_data'ポインタで任意のパラメータを渡すことができます。構造体変数を作成し、それにポインタを渡すことができます。 – Gerhardh

答えて

1

コードは良くないですが、それが問題ではない、そうではなく、ダブルクリックで最初の第二のツリービューが表示されない特定の問題を解決するために:

  1. @Gerhardhが言ったように、あなたはそれ以外のアプリケーションが行をダブルクリックでセグメンテーションフォールトます、最後の引数としてコールバックにパラメータを渡す必要があります。g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), parameters);
  2. あなたはreplace_tab機能では、新しいツリービューを表示する必要があります。gtk_widget_show_all (GTK_WIDGET(parameters->parent));
上記の提案と

あなたのコード:

#include <gtk/gtk.h> 
#include <glib.h> 
#include <stdlib.h> 
GtkWidget * init_tree(); 
GtkWidget * init_tree2(); 
GtkWidget *scrolledwindow; 
struct param 
{ 
    GtkWidget*parent; 
    GtkWidget*newChild; 
}; 

static void destroy(GtkWidget *widget, gpointer data) 
{ 
    gtk_main_quit(); 
} 

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) 
{ 
    struct param* parameters = (struct param*)user_data; 
    gtk_container_remove(GTK_CONTAINER(parameters->parent), (GtkWidget*)tree_view); 
    gtk_container_add(GTK_CONTAINER(parameters->parent), init_tree2()/*parameters->newChild*/); 
    gtk_widget_show_all (GTK_WIDGET(parameters->parent)); 
} 


GtkWidget * init_tree() 
{ 
    GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING); 
    GtkTreeIter treeiter; 

    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 

    GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore)); 

    GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new(); 

    GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions", 
                       cellrenderertext, 
                       "text", 0, 
                       NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn); 

    return treeview; 
} 

GtkWidget * init_tree2() 
{ 

    GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING); 
    GtkTreeIter treeiter; 

    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "a", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "b", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "c", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "d", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "e", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "f", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); 

    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 

    GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore)); 

    GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new(); 

    GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions", 
                       cellrenderertext, 
                       "text", 0, 
                       NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn); 

    return treeview; 
} 

int main(int argc, char *argv[]) 
{ 
    gtk_init(&argc, &argv); 

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); 
    g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL); 

    GtkWidget *notebook = gtk_notebook_new(); 
    gtk_container_add(GTK_CONTAINER(window), notebook); 


    int count; 
    gchar *text; 

    for (count = 1; count <= 5; count++) 
    { 
     GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); 
     text = g_strdup_printf("Page %d", count); 
     GtkWidget *label = gtk_label_new(text); 
     GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL); 

     gtk_widget_set_size_request(scrolledwindow, -1, 200); 

     gtk_container_add(GTK_CONTAINER(vbox), scrolledwindow); 
     GtkWidget* treeview = init_tree(); 
     GtkWidget* treeview2 = init_tree2(); 
     struct param* parameters = malloc(sizeof(struct param)); 
     parameters->parent = scrolledwindow; 
     parameters->newChild= treeview2; 
     g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), parameters); 
     gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); 

     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); 
    } 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 
用に定義されたプロトタイプと一致している必要がありあなたのコールバックが
+0

もう1つ必要なことは、treeview2がページ全体を消費することです。私は左下隅に別の戻るボタンが必要です。クリックすると、最初のツリービューが表示されます。 –

+1

@SagarMohantu、2つのバージョンを切り替える場合は、削除する代わりにウィジェットを隠すだけの方がいいかもしれません。 – Gerhardh

+0

あなたは投稿を見ることができますhttps://stackoverflow.com/questions/47399178/gtk-back-button-does-not-remove-from-grid-liststore-treeview-row-is-not-shown-fu –

関連する問題