主旨:
handler_block
在逐个案例的基础上很有用,但我宁愿在程序开头调用一些东西来抑制对gtk_entry_set_text
和gtk_toggle_button_set_active的所有调用的信号。有办法吗?
背景资讯:
我的程序用于通过具有以下属性的角色创建者对话框创建实体:
名称 - 通过GTKComboBoxes从预定列表中选择
动画 - 也是一个GTKComboBox
组 - 对实体进行分类的六个单选按钮之一
可以添加实体 - 一个以空白的添加对话框开头,填写所有字段并提交。
可以通过“编辑”对话框编辑实体,其中上面列出的所有字段最初都填充了实体的当前属性。编辑是即时的(编辑对话框中没有“提交”按钮),只要选择了组合或单选按钮中的新值,显示的实体就会显示不同。
我有一个连接到Type条目的回调,并由“已更改”信号触发。每当我在代码中手动设置条目文本以显示正在编辑的实体时,回调似乎会触发:
gtk_entry_set_text(GTK_ENTRY(name_entry), entity.name); // name is a char*
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (group_button_friendly), TRUE);
是的,g_signal_handler_block
有一种方法,但这需要
1)获取首先连接信号时创建的gulong
。
g_signal_connect(args);
与
gulong entry_handler_id = g_signal_connect(args);
2)每次调用使用阻止/解除阻塞习语。
g_signal_handler_block(args, entry_handler_id);
gtk_entry_set_text(args);
g_signal_handler_unblock(args, entry_handler_id);
或者更糟,
g_signal_handler_block(args, entry_handler_id);
fn_that_calls_gtk_entry_set_text();
g_signal_handler_unblock(args, entry_handler_id);
答案 0 :(得分:1)
我认为你要找的是g_signal_handlers_block_matched
。如果你使用信号中使用的闭包将掩码设置为G_SIGNAL_MATCH_CLOSURE
,它应该可以解决问题。
您必须查找signal_id
以查找正在发出的信号,但您只需要执行一次,因为所有小部件之间的信号ID相同,这就是实例的原因。电话中也需要。
要取消阻止,您要使用g_signal_handlers_unblock_matched
。