gpt4 book ai didi

c++ - 通过代码触发回调时抑制 GTK 信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:53 27 4
gpt4 key购买 nike

要点:

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) 首先获取连接信号时创建的gulongg_signal_connect(args);对比gulong entry_handler_id = g_signal_connect(args);

2) 对每个调用都使用 block/unblock 习惯用法。
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);

最佳答案

我认为您正在寻找的是 g_signal_handlers_block_matched。如果您将掩码设置为 G_SIGNAL_MATCH_CLOSURE 并在信号中使用闭包,它应该可以解决问题。

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

要取消阻止,您需要使用 g_signal_handlers_unblock_matched

关于c++ - 通过代码触发回调时抑制 GTK 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13348616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com