吉斯特触发信号:禁止GTK回调时通过代码
handler_block
是根据具体情况逐案有用的,但我宁愿放弃一些在节目的开始打压的信号所有致电gtk_entry_set_text
和gtk_toggle_button_set_active。有没有办法?
背景信息:
我的程序用于通过具有以下属性的字符的创建者对话框,使实体:
名称 - 通过GTKComboBoxes
动画从预定列表中选择 - 也GTKComboBox
组 - 六个单选按钮之一分类实体
可以添加实体 - 一个以空白添加对话框开始,填写所有字段并提交。
实体可以通过编辑对话框进行编辑,其中上面列出的所有字段最初都用实体的当前属性填充。编辑是即时的(在编辑对话框中没有提交按钮),并且一旦选择了来自组合或单选按钮的新值,所显示的实体将显示为不同。
我有一个回调连接到类型条目,并由“更改”信号触发。回调似乎触发每当我在代码中手动设置条目文字显示实体正在编辑:
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);
您可以将窗体中的文本与“已保存”信息进行比较,然后返回?我不知道是否有办法从触发中清空事件。在一个即时编程应用程序中,我只需要修改事件或任何写入它的值,基本上就是说你写了你刚刚写回的内容,但它并没有真正妨碍我(假设你没有这样做你的回调中有什么特别之处)。 – senshikaze
而不是像这样阻止你自己的处理程序,你可以设置一些标志变量,告诉处理程序什么都不做。据我所知,GTK +为什么会发出信号,即使是源代码发生变化的原因也是健壮的。例如。两个库(或一个库和你自己的代码)可以连接到同一个对象,但仍然可以看到彼此所做的更改。] * – doublep
感谢您的解释@doublep。我疯了,诅咒这个图书馆的创造者,但很高兴知道这个令人沮丧的概念背后有一个原因。我目前使用一个称为_suppress_callback的布尔,尽管这只是解决了问题(1),并仍然要求我用两行代码来限制违规函数。 – nnnn