2017-11-21 6 views
1

"행 활성화"이벤트를 유발하는 트리 뷰에서 클릭 한 항목을 가져 오려고합니다. 트리 뷰에 목록 저장소가 있습니다. 그것의 아무 품목 나 누르는 것은 또 다른 명부를 보여준다. 하지만 어떤 항목을 클릭했는지 어떻게 알 수 있습니까? 어떻게 찾을 수 있습니까? 더블 클릭 (row-activated)에 treeview 선택을받을 코드 -gtk-liststore 트리 뷰에서 어떤 항목을 클릭했는지 확인

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, "Register", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "New Configuration", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Edit Configuration", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Delete Configuration", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Add location to turn-off place list", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Disable Turn-off Places", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Enable Turn-off Places", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Disable Distance", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Enable Distance", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    gtk_list_store_set(liststore, &treeiter, 0, "Factory Reset", -1); 
    gtk_list_store_append(liststore, &treeiter); 
    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("Settings", 
                       cellrenderertext, 
                       "text", 0, 
                       NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn); 

    return treeview; 
} 

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) 
{ 
.......... 
} 

int main(...) 
{ 
.... 
g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer) parameters); 

..... 
} 

답변

1

가장 일반적인 방법은 다음과 같습니다 row-activated 콜백에서

1. 변수 사용

row-activated에서 신호 처리기 신호 :

void 
user_function (GtkTreeView  *tree_view, 
       GtkTreePath  *path, 
       GtkTreeViewColumn *column, 
       gpointer   user_data) 

노출 변수가있는 모델에서 데이터를 검색 할 수 있습니다. GtkTreePath path에서 우리는 GtkTreeIter iter을 얻고 GtkTreeView treeview에서 GtkTreeModel model을 얻을 수 있습니다. modeliter을 사용하면 model에서 데이터를 검색 할 수 있습니다. 예. 당신의 replace_tab 신호 처리기에서, 다음을 추가

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) 
{ 
    gchar *string; 
    GtkTreeIter iter; 
    GtkTreeModel *model = gtk_tree_view_get_model (tree_view); 
    gtk_tree_model_get_iter(model, &iter, path); 
    gtk_tree_model_get (model, &iter, 0, &string, -1); 
    g_print ("activated: %s\n", string); 
    ... 

} 

이 GtkTreeSelection

또 다른 옵션은 우리가 검색 할 수있는 GtkTreeSelection을 사용하는 것입니다

를 사용하여 활성화 된 행

2에서 텍스트를 인쇄한다 GtkTreeView 그 자체 이 단계를 통해 우리는 model에서 데이터를 얻을 선택된 iter (트리보기에서 단일 선택)을 추출 할 수 있습니다. 예를 들어, 귀하의 replace_tab 신호 처리기에서, 다음을 추가

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) 
{ 
    gchar *string; 
    GtkTreeIter iter; 
    GtkTreeSelection *selection; 
    GtkTreeModel *model = gtk_tree_view_get_model (tree_view); 

    selection = gtk_tree_view_get_selection (tree_view); 
    gtk_tree_selection_get_selected (selection, &model, &iter); 
    gtk_tree_model_get (model, &iter, 0, &string, -1); 
    g_print ("activated: %s\n", string); 
    ... 
} 

결론 :

옵션 1)이 정직하고, 쉽게 깨끗하고 있습니다. 일반적으로 2)는에 의해 방출 된 changed 신호를 통해 선택 변경을하는 데 사용됩니다.