4

要点

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);

4

1 回答 1

1

我想你要找的是g_signal_handlers_block_matched. 如果您将掩码设置为仅G_SIGNAL_MATCH_CLOSURE使用信号中使用的闭包,它应该可以解决问题。

您必须查找signal_id正在发出的信号,但您应该只需要执行一次,因为所有小部件之间的信号 id 都是相同的,这就是调用中也需要实例的原因。

并解除阻止您要使用g_signal_handlers_unblock_matched的 .

于 2012-11-14T23:35:42.290 回答