2016-10-31 13 views
1

GTK3을 사용하는 응용 프로그램에서 몇 가지 효율성 문제가 있으며 도움을받을 수 있기를 바랍니다.C 함수에서 gtk_tree_selection의 선택된 행을 변경하십시오.

gtk_list_store가 gtk_tree_view에 표시되어 있습니다. 트리보기에서 여러 행을 선택할 수 있습니다. tree_selection의 "changed"이벤트에 콜백 함수를 연결했습니다. 사용자가 행을 선택하거나 선택 취소 할 때마다이 콜백이 호출됩니다. 그러면 일부 계산이 완료되고 다른 gtk 위젯의 일부 이미지와 내용이 그에 따라 업데이트됩니다. 지금까지는 문제가 없습니다.

목록 저장소에 새 항목이 추가 될 때마다 트리보기의 마지막 줄에 선택 항목을 설정하려는 경우 (일부 플래그가 설정된 경우).

지금까지, 모든 라인을 취소 새로운 라인을 선택하고 마지막 항목에보기를 아래로 스크롤하는 것입니다 발견 솔루션 : 두 "로 변경이 기본적으로 잘 작동하지만, 지금 얻을

// Create new entry 
gtk_list_store_append(liststore, &iter); 
... 
// Set data for entry 
gtk_list_store_set(liststore, &iter, ......); 
... 
// Make the new entry the (only) selected row 
gtk_tree_selection_unselect_all(packet_tree_view_selection); 
gtk_tree_selection_select_iter(packet_tree_view_selection, &filter_iter); 
... 
// scroll down to the new entry 
GtkTreeModel *model = gtk_tree_model_filter_get_model(packet_store.filtered); 
GtkTreePath *path = gtk_tree_model_get_path(model, &iter); 
gtk_tree_view_scroll_to_cell(packet_tree_view, path, NULL, FALSE, 1.0, 0.0); 

"gtk_tree_view_selection 이벤트.

on_selection_changed 콜백 내에서 일부 그래픽을 계산하고 다시 그리기 때문에 두 번 작업을하지 않으려합니다.

물론 글로벌 플래그를 "콜백 (callback)"기능에서 체크 된 "모두 선택 해제를 무시하십시오"라고 소개 할 수 있습니다. 그러나 이것은 다소 추한 것입니다.

변경이 완료된 후에 하나의 최종 이벤트 만 트리거하는 단일 호출에서 선택을 변경하는 방법이 있습니까? 여러 작업이 완료되고 잠기지 않은 상태에서 이벤트가 시작되는 동안 일부 이벤트가 잠길 수 있습니까?

답변

1

신호에 connect a callback을 입력 할 때마다 처리기 ID (gulong)가 표시됩니다. 그런 다음 해당 콜백 트리거링을 방지하기 위해 g_signal_handler_blockg_signal_handler_unblock를 사용할 수 있습니다

gulong changed_id; 
changed_id = g_signal_connect(packet_tree_view_selection, 
           "changed", 
           ...); 
... 
g_signal_handler_block(packet_tree_view_selection, changed_id); 
gtk_tree_selection_unselect_all(packet_tree_view_selection); 
g_signal_handler_unblock(packet_tree_view_selection, changed_id); 
gtk_tree_selection_select_iter(packet_tree_view_selection, &filter_iter); 

을 당신은 당신이 또한 기본적으로 기능을 보면 같은 일을 g_signal_handlers_block_by_func을 사용할 수 있습니다 주위 핸들러 ID를 유지하지 않으려면 변경된 신호의 핸들러 목록.

+0

답장을 보내 주셔서 감사합니다. 그것은 완벽하게 작동합니다. – Gerhardh