从C函数更改gtk_树_选择中的选定行

从C函数更改gtk_树_选择中的选定行,c,gtk,gtktreeview,C,Gtk,Gtktreeview,我在使用GTK3的应用程序中有一些效率问题,希望您能提供一些帮助 我有一个gtk_列表_存储,它显示在gtk_树视图中。 树状视图允许选择多行。 我已将回调函数连接到树选择的“更改”事件。 每当用户选择或取消选择任何行时,都会调用此回调。 然后进行一些计算,并相应地更新其他gtk小部件的一些图像和内容。 到目前为止还不错 我还想在列表存储中添加新条目(并设置了某些标志)时,将选择设置为树状图的最后一行 到目前为止,我找到的解决方案是取消选择所有行,选择新行并向下滚动视图到最后一个条目: // C

我在使用GTK3的应用程序中有一些效率问题,希望您能提供一些帮助

我有一个gtk_列表_存储,它显示在gtk_树视图中。 树状视图允许选择多行。 我已将回调函数连接到树选择的“更改”事件。 每当用户选择或取消选择任何行时,都会调用此回调。 然后进行一些计算,并相应地更新其他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_树视图选择的两个“更改”事件

当我在on_selection_changed回调中进行计算并触发某些图形的重画时,我希望避免重复这项工作

当然,我可以引入一些全局标志来“ignore unselect all”,它在回调函数中被选中。但这相当难看

是否有某种方法可以在一次调用中更改选择,在完成更改后只触发最后一个事件? 在执行多个操作时,可能会锁定一些事件,并且在再次解锁时会触发事件?

每当您发送信号时,都会获得处理程序id(a
gulong
)。然后可以使用和避免触发该回调:

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);
如果您不想保留处理程序id,您也可以使用它,它通过在已更改信号的处理程序列表中查找函数来执行基本相同的操作