如何使用具有已注册 GType 而非 GObject 类型值的属性?

How to use properties with values of a type that is a registered GType, but not a GObject?

我想在基于 class 的自定义 GObject 上定义属性,属性 的类型为 GstStructure *。这是注册的 GType,但不是 GObject 的子class。属性设置和检索为 GValue,但 GValue 似乎不支持 GType 值。可以创建一个 g_param_spec_gtype,但该工厂函数的 GType 参数称为 is_a_type,这令人困惑,因为它暗示布尔值,所以我不确定这种类型的参数规范是什么为了。我应该只将它注册为指针并为了简单而牺牲一些类型安全性,还是应该使用 GBoxed?

GTypeGParamSpec 用于存储实际的 GType 值,而不是用于存储在类型系统中注册的类型的实例。

GLib 没有为基本的可实例化类型提供 GParamSpec——即从 GTypeInstance 继承但不从 GObject 派生的类型——因为 GLib 对它们一无所知:它们是一个单独的层次结构。

如果一个库为您提供基本的可实例化类型,那么该库还应该为您提供:

  • GValue 包装器,用于属性和信号中的装箱和拆箱实例
  • 一个 GParamSpec 类型和一个 API 来定义 GObject 属性

GstStructure 类型是引用计数的普通旧数据类型,它继承自 GBoxed;这意味着您可以使用 g_param_spec_boxed() 来定义一个包含 GstStructure 实例的 属性。