2017-05-01 1 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); 
} 

왜 그런가요? 문자열이있는 두 개의 열과 마지막에 체크 상자가있는 트리보기가 표시됩니다. 지금 당장 체크 박스가 나타나지만 토글 할 수는 없습니다.GTKTreeView의 GTKCellRendererToggle

답변

1

셀 렌더러 (토글)는 모델에서 '바인딩 된'값을 반영합니다. 셀 렌더러가 상태를 읽을 모델을 업데이트하는 콜백을 사용하여 을 전환하고 신호를 처리해야합니다. 확인 CellRendererToggle 'toggled' signal reference :

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

그것은 와 경로에 저장할 수있는 올바른 값을 모델을 업데이트 할 수있는 응용 프로그램의 책임입니다. 종종 이것은 현재 경로에 저장된 값의 반대 일뿐입니다. 마지막 렌더러 포인터를 사용

편집 는 토글 콜백을 설정하고 콜백에 값을 업데이트하는 모델을 변경

[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를 반대 값으로 설정하십시오. 콜백은 geter 경로에서 경로를 제공하고 iter는 열 2 실제 값 (gtk_tree_model_get (...))을 얻은 다음 gtk_list_store_set을 사용하여 값을 반대 (negate) 값으로 설정합니다. 기억 전환은 열 2에 바인드되며 ** user_data **를 사용하여 tree_view를 전달할 수 있습니다 (모델을 가져올 수 있음). –

+1

편집자 주셔서 감사합니다. 나는 일하고 있었고 빨리 답장을하려했다. 나는 실수가 있다는 것을 알았지 만 그것을 고칠 시간이 없었습니다. 기여 해주셔서 감사합니다. –