调用gtk_widget_set_sensitive导致GTK程序崩溃问题求助
嘿,这事儿我熟!用结构体传递控件上下文来实现单选按钮控制Entry的可编辑状态,完全是GTK开发里的常规操作,我给你一步步捋清楚怎么实现:
实现方案拆解
1. 确保结构体与控件关联正确
你定义的gui_ctx结构体没问题,关键是在main函数里要把你的Entry组件指针正确赋值给ctx.entry,比如:
// 假设你已经创建了Entry组件 GtkWidget *entry = gtk_entry_new(); gui_ctx ctx; ctx.entry = entry;
2. 给单选按钮绑定toggled信号
单选按钮(GtkRadioButton)状态变化时会触发toggled信号,我们需要给每个相关的单选按钮绑定这个信号,同时把ctx的指针作为用户数据传进去:
// 假设你创建了两个单选按钮:btn_editable(允许编辑)和btn_readonly(只读) GtkWidget *btn_editable = gtk_radio_button_new_with_label(NULL, "允许编辑"); GtkWidget *btn_readonly = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(btn_editable), "只读"); // 绑定信号,把ctx的地址传给回调函数 g_signal_connect(btn_editable, "toggled", G_CALLBACK(on_radio_toggled), &ctx); g_signal_connect(btn_readonly, "toggled", G_CALLBACK(on_radio_toggled), &ctx);
3. 实现信号回调函数
回调函数里我们需要先拿到传入的gui_ctx,然后判断当前选中的单选按钮,再设置Entry的sensitive属性(TRUE是可编辑,FALSE是不可编辑):
static void on_radio_toggled(GtkWidget *button, gpointer user_data) { // 转换用户数据为我们的结构体指针 gui_ctx *ctx = (gui_ctx *)user_data; // 判断当前按钮是否被选中(因为toggled信号不管选还是取消都会触发,所以要先判断状态) if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) { // 获取按钮的文本,或者直接通过按钮指针判断(更可靠) const gchar *label = gtk_button_get_label(GTK_BUTTON(button)); if (g_strcmp0(label, "允许编辑") == 0) { gtk_widget_set_sensitive(ctx->entry, TRUE); } else if (g_strcmp0(label, "只读") == 0) { gtk_widget_set_sensitive(ctx->entry, FALSE); } } }
额外实用提示
- 如果你不想通过按钮文本判断(避免文本修改后回调逻辑失效),可以给按钮设置自定义标记:
// 创建按钮时标记属性 g_object_set_data(G_OBJECT(btn_editable), "is_editable", GINT_TO_POINTER(TRUE)); g_object_set_data(G_OBJECT(btn_readonly), "is_editable", GINT_TO_POINTER(FALSE)); // 回调里直接读取标记判断 gboolean is_editable = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "is_editable")); gtk_widget_set_sensitive(ctx->entry, is_editable); - 记得在程序初始化时同步Entry的初始状态和默认选中的单选按钮,避免出现状态不一致的情况。
这样整个流程就通了,把这些代码整合到你的项目里,就能实现单选按钮切换Entry的可编辑状态啦!
内容的提问来源于stack exchange,提问作者dangee1705
相关产品推荐
相关产品推荐

