当通过代码触发回调时,抑制GTK信号
Suppress GTK signal when callback is triggered via code
Gist:
handler_block
在具体情况下是有用的,但我宁愿在程序开始时调用一些东西,以抑制对gtk_entry_set_text
和gtk_thogg_button\uset_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);
我想您要找的是g_signal_handlers_block_matched
。如果您将掩码设置为仅G_SIGNAL_MATCH_CLOSURE
,并在信号中使用闭包,那么它就可以完成任务。
您必须在signal_id
中查找正在发出的信号,但您只需要这样做一次,因为所有小部件之间的信号id都是相同的,这就是为什么调用中也需要实例的原因。
要解除锁定,您需要使用g_signal_handlers_unblock_matched
。
- 如何在运行中期切换GTK CSS style_context
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 如何使用 GTK 3 正确设置默认文本
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 是否可以编译 Gtk+ 应用程序以同时在 Gtk 2 和 3 上运行
- GTK 最大化表单 C++
- GTK:完全摆脱系统主题/CSS
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么此程序显示"unreachable code"警告?我该如何抑制它?
- Gtk::带有set_icon_name的窗口图标集在 wayland 上不起作用
- GTK 3 C++按钮中带有标签的图标
- 瓦尔格林德可能丢失了,仍然可以到达并被瓦尔格林德检测到并被抑制
- Gtkmm:创建一个Gtk::ComboBox,其中列出Gtk::DrawingArea
- 用GTK创建逻辑门模拟器,如何制作放置区域
- 我可以转义(抑制)C预处理器宏扩展吗
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 使用NOLINT抑制叮当声.如何抑制抑制?
- 当通过代码触发回调时,抑制GTK信号