首页 > 解决方案 > 如何使用具有已注册 GType 但不是 GObject 类型的值的属性?

问题描述

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

标签: gobject

解决方案


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

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

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

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

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


推荐阅读