gobject - 如何使用具有已注册 GType 但不是 GObject 类型的值的属性?
问题描述
我想在基于 GObject 的自定义类上定义属性,其属性类型为GstStructure *
. 这是一个注册的 GType,但不是 GObject 的子类。属性设置和检索为GValue
,但 GValue 似乎不支持GType
值。可以创建一个g_param_spec_gtype
,但是该工厂函数的 GType 参数被称为is_a_type
,这令人困惑,因为它意味着布尔值,所以我不确定这种类型的参数规范是做什么用的。为了简单起见,我应该将它注册为指针并牺牲一些类型安全,还是应该使用 GBoxed?
解决方案
GParamSpec
forGType
用于存储实际值,而GType
不是用于存储在类型系统中注册的类型的实例。
GLib没有GParamSpec
为基本的可实例化类型(即继承自GTypeInstance
但不派生自的类型)提供任何信息,GObject
因为 GLib 对它们一无所知:它们是一个单独的层次结构。
如果一个库为您提供了一个基本的可实例化类型,那么同一个库也应该为您提供:
GValue
包装器,用于在属性和信号中装箱和拆箱实例- 用于定义 GObject 属性的
GParamSpec
类型和 API
但是,该GstStructure
类型是一个引用计数的普通旧数据类型,它继承自GBoxed
; 这意味着您可以使用它g_param_spec_boxed()
来定义一个包含GstStructure
实例的属性。
推荐阅读
- laravel - 它在有两个值时返回“null”,但在 laravel 的 foreach 循环中有单个值时返回值
- azure - 除了使用 ARM 模板之外,还有其他方法可以部署 Azure 数据工厂吗?
- python - 一些库的 pip install requirements.txt 和 -t
- java - 如何调用在上层类中声明的变量
- python - 使用 pandas 时如何克服 Mac 中的操作系统错误
- sql - 如何为动态 SQL 查询创建结构?
- ruby-on-rails - 如何关闭引导模式?
- rest - 用于替换 PUT 的多个资源的 ReST API
- kubernetes - 无法启动 Kube-apiserver 服务
- spring-boot - 在 eclemma 插件中加载覆盖会话(代码 5001)时出错