如何无需回调直接连接G信号?是否有g_signal_connect替代方案
解决方案:使用
g_signal_connect_swapped 你可以用g_signal_connect_swapped实现需求,这个函数会调整信号触发时传递给回调的参数顺序,让gtk_entry_set_visibility直接适配信号的参数要求:
// 点击图标时固定将输入框设置为不可见 g_signal_connect_swapped(entry, "icon-press", G_CALLBACK(gtk_entry_set_visibility), GINT_TO_POINTER(FALSE));
原理是:gtk_entry_set_visibility的签名为void gtk_entry_set_visibility(GtkEntry* entry, gboolean visible),而icon-press信号的回调签名是void (*GtkEntryIconPressFunc)(GtkEntry* entry, GtkEntryIconPosition pos, gpointer user_data)。g_signal_connect_swapped会把用户数据(这里的FALSE)作为第二个参数传给API函数,把触发信号的entry作为第一个参数,刚好匹配gtk_entry_set_visibility的参数顺序。
如果需要切换输入框可见性(而非固定设置为某个值),还是需要一个极简的匿名回调来读取当前状态并反转:
g_signal_connect(entry, "icon-press", G_CALLBACK( (void (*)(GtkEntry*, GtkEntryIconPosition, gpointer)) (GtkEntry* e, GtkEntryIconPosition p, gpointer d) { gtk_entry_set_visibility(e, !gtk_entry_get_visibility(e)); } ), NULL);
这种写法无需单独定义函数,代码量同样极少。
内容的提问来源于stack exchange,提问作者Bret Joseph
相关产品推荐
相关产品推荐

