【问题标题】:Init GValue for a struct为结构初始化 GValue
【发布时间】:2016-09-16 17:37:07
【问题描述】:

我正在尝试从GValue 中获取GdkRGBA,但我无法使用这种类型初始化GValue

我尝试了以下代码:

GValue value;
g_value_init(value, G_TYPE_OBJECT);
gtk_style_context_get_property(style_context, "color", STATE_FLAG_NORMAL, &value);

但我收到以下错误:

无法初始化“GdkRGBA”类型的GValue,该值已经被初始化为“GObject”

我尝试了许多其他G_TYPE_*,但我得到了类似的错误。

如何使用GdkRGBA 类型初始化GValue

【问题讨论】:

    标签: c glib gobject


    【解决方案1】:

    尝试完全删除对 g_value_init 的调用 - 从错误消息判断,gtk_style_context_get_property 似乎想要自行初始化 GValue

    另外,我注意到 a separate method defined on GtkStyleContext 专门用于检索前景色,因此这可能是一个合适(或更可取)的替代方案:

    GdkRGBA color;
    gtk_style_context_get_color(style_context, GTK_STATE_FLAG_NORMAL, &color);
    

    【讨论】:

    • 这不是错误所说的。它并没有说它想要初始化 GValue。它说用户将 GValue 初始化为错误的类型。您不能将 GValue 设置为它还没有的类型的值。 GdkRGBA 不是 GObject。我完全不确定GtkStyleContext 是否会启动GValue;当然,它没有被记录为这样做,所以告诉用户他们不需要初始化可能是有风险的,特别是当他们的问题只是做错了。他们应该使用GDK_TYPE_RGBA,但似乎他们错过了那个。但是您指出的方法更好;我给你!
    • fwiw,我看到在我自己的一些代码中,我只是在做GValue gvalue = G_VALUE_INIT; gtk_style_context_get_property([...], &value);,这似乎有效:G_VALUE_HOLDS_[type of style property] 的后续断言有效,我得到了正确的值。所以,GtkStyleContext 似乎对此很满意,至少,我会说用户至少应该传递一个初始化为零的 GValue,如果不是初始化为特定类型的 GValue - 尤其是错误的类型!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多