C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 通过代码触发回调时抑制GTK信号大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
要旨:

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(参数);

gulong entry_handler_id = g_signal_connect(args);

2)对每个呼叫使用阻塞/解除阻塞习语.
g_signal_handler_block(args,entry_handler_id);
gtk_entry_set_text(参数);
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信号全部内容,希望文章能够帮你解决c – 通过代码触发回调时抑制GTK信号所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。