2017-05-01 15 views
2
for(int i=0; i<2; i++) { 
    types[i] = G_TYPE_STRING; 
} 
types[2] = G_TYPE_BOOLEAN; 

tree_store = gtk_list_store_newv(3, types); 

tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(tree_store)); 

gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), tree_view); 

GtkTreeViewColumn *column; 
GtkCellRenderer *renderer; 
renderer = gtk_cell_renderer_text_new(); 
column = gtk_tree_view_column_new_with_attributes ("Level",renderer,"text",0,NULL); 
gtk_tree_view_column_set_sort_column_id (column, 0); 
gtk_tree_view_column_set_resizable (column, true); 
gtk_tree_view_append_column (GTK_TREE_VIEW(tree_view), column); 

renderer = gtk_cell_renderer_text_new(); 
column = gtk_tree_view_column_new_with_attributes ("URL",renderer,"text",1,NULL); 
gtk_tree_view_column_set_sort_column_id (column, 1); 
gtk_tree_view_column_set_resizable (column, true); 
gtk_tree_view_append_column (GTK_TREE_VIEW(tree_view), column); 

renderer = gtk_cell_renderer_toggle_new(); 
column = gtk_tree_view_column_new_with_attributes ("Image",renderer,"active",2,NULL); 
gtk_tree_view_column_set_sort_column_id (column, 2); 
gtk_tree_view_column_set_resizable (column, true); 
gtk_tree_view_append_column (GTK_TREE_VIEW(tree_view), column); 

for(int i=0; i<mapTiles.size(); i++) { 
    GtkTreeIter iter; 
    gtk_list_store_append(tree_store, &iter); 
    gtk_list_store_set(tree_store, &iter, 0, "A", -1); 
    gtk_list_store_set(tree_store, &iter, 1, "B", -1); 
    gtk_list_store_set(tree_store, &iter, 2, FALSE, -1); 
} 

なぜですか? 私は、文字列と最後にチェックボックスを含む2つの列を持つツリービューを作成しようとしています。今はチェックボックスが表示されますが、切り替えることはできません。GTKTreeViewのGTKCellRendererToggle

答えて

1

セルレンダラー(トグル)は、モデルに「バインド」されている値だけを反映します。 に切り替えて、セルレンダラーが状態を読み取るモデルを更新するコールバックを処理する必要があります。チェックCellRendererToggle 'toggled' signal reference

void user_function (GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data) 

それは とパスで保存するための正しい値をモデルを更新するアプリケーションの責任です。しばしばこれは現在、パスに現在格納されている値の反対の です。最後のレンダラポインタを使用して

EDIT は、トグルのコールバックを設定し、コールバックに値を更新するためにモデルを変更:

[your code] 
... 
renderer = gtk_cell_renderer_toggle_new(); 
... 
g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(on_toggle_renderer_toggled), tree_view); 
... 

void on_toggle_renderer_toggled (GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data) { 
    gboolean val; 
    GtkTreeIter iter; 
    GtkTreeModel *model; 
    model = gtk_tree_view_get_model (GTK_TREE_VIEW(user_data)); 
    if (gtk_tree_model_get_iter (model, &iter, path) == false) return; 
    gtk_tree_model_get(model, &iter, 2, &val, -1); 
    gtk_list_store_set(GTK_LIST_STORE(model), &iter, 2, !val, -1); 
} 

PS:上記のコードは試験しなかったので、多分いくつかのタイプミスや欠けているビットがあります。

+1

ありがとうございました!コールバック関数を呼び出すことができます。ただし、cell_renderer-> active = trueを実行しても、チェックボックスはクリックされません。それをチェックする方法を知っていますか? –

+0

cell_rendererではなく、モデルを変更する必要があります。コールバックで、列2を反対の値に設定します。コールバックはパスからパスを取得し、iterはカラム2の実際の値(gtk_tree_model_get(...))を取得し、gtk_list_store_setを使用して値を反対(ネゲート)に設定します。トグルは列2にバインドされており、** user_data **を使用してtree_view(モデルを取得できる)を渡すことができます。 –

+1

編集者に感謝します。私は働いていて、すぐに返答しようとしました。私はいくつかの間違いがあることを知っていましたが、それらを修正する時間がありませんでした。貢献に感謝します。 –

関連する問題