You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:22:51