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

使用g_object_bind_property双向绑定字符串时UI冻结,绑定数字无异常的问题求助

g_object_bind_property双向绑定字符串时UI冻结,绑定数字无异常的问题求助

各位好,我最近在做GTK4项目,尝试从自定义对话框更新GtkColumnView的行数据时遇到了一个棘手的问题:用g_object_bind_property做双向绑定时,绑定数字类型属性完全正常,界面能实时更新且流畅,但绑定字符串类型属性时,只要一修改输入框内容,整个UI就直接冻结,只能强制退出程序。

下面是我定义数据模型的关键代码(cell_item.c),麻烦帮忙排查下问题:

#include "CellItem.h"

struct _CellItem
{
    GObject parent_instance;
    char *name;
    char *carrera;
    int grado;
};

struct _CellItemClass
{
    GObjectClass parent_class;
};

enum {
    PROP_NAME = 1,
    PROP_CARRER = 2,
    PROP_GRADE = 3,
    N_PROPERTIES
};

GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };

G_DEFINE_TYPE (CellItem, cell_item, G_TYPE_OBJECT)

void cell_item_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
    CellItem *self = CELL_ITEM (object);
    
    switch (prop_id)
    {
        case PROP_NAME:
            g_value_set_string (value, self->name);
            break;
        case PROP_CARRER:
            g_value_set_string (value, self->carrera);
            break;
        case PROP_GRADE:
            g_value_set_int (value, self->grado);
            break;
        default:
            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
            break;
    }
}

(注:代码后续部分不小心截断了,但get_property逻辑是完整的;set_property我是按常规GObject属性写法,先g_free旧值,再用g_strdup复制新值,最后通知属性变化)

我在对话框中的绑定代码大致如下:

// 绑定数字属性(正常工作)
g_object_bind_property(entry_grade, "text", selected_item, "grado",
                      G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);

// 绑定字符串属性(导致UI冻结)
g_object_bind_property(entry_name, "text", selected_item, "name",
                      G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);

有没有大佬遇到过类似问题?或者能看出我在字符串属性定义/处理上有什么遗漏吗?比如有没有字符串特有的GObject属性配置项我没加?

备注:内容来源于stack exchange,提问作者Joel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 11:09:50