Qtilities:属性 浏览器的自定义 属性 类型?
Qtilities: Custom property types for the property browsers?
我正在编写一个程序,要求用户非常灵活地操作给定对象上的数据。我想我会使用某种 属性 浏览器; Qtilities 的 ObjectDynamicPropertyBrowser
引起了我的注意。
但是,我需要能够添加自己的数据类型。文档不清楚如何操作。
如何让我自己的数据类型在 Qtilities 的 属性 浏览器小部件中显示?
此外,更多关于我的需求:
- 数据类型不是 Qt 的一部分,甚至
Q_OBJECT
s 也不是。
- 对相关 类 的 Qt 特定修改不是一个选项。
- 通过
Q_DECLARE_METATYPE
声明相关的 类 没问题。
- 特别是,我需要表示向量和矩阵类型(以后可能会更多)。
您所指的浏览器依赖QObject
属性系统。所以,除非你的 classes 是 QObjects,否则它不会工作 - 但不要绝望,Qt 5.5 可以拯救(继续阅读)。浏览器似乎使用了 QTreeView
并提供了一个公开 QObject
属性 系统的适配器模型。因此,它利用了 Qt 的类型和委托系统。
在 Qt 5.5 中,有一个通用的 属性 系统,称为小工具,可以在任何 class 上使用,只要有一个 QMetaObject
描述class。通过将 Q_GADGET
宏添加到从主题 class 派生的 class,并使用 Q_PROPERTY
宏描述属性,您可以利用 moc
和小工具系统访问您未修改的类型的属性。
您这样做的唯一原因是需要对 ObjectPropertyBrowser
系统进行最少的更改。您不需要 ObjectDynamicPropertyBrowser
,因为它适用于动态属性,而您的对象没有。它们具有静态属性,通过 Q_PROPERTY
宏和 moc 生成的代码给出。
因此,您将继续为 QVariant
和一般视图实现自己的类型支持。您还需要 Qt 5.5,因为您需要小工具支持才能工作。 Qt 5.4 及更低版本的解决方案需要不同的方法,并且以其他方式实施可能不那么麻烦。
有关使用小工具 属性 系统进行对象序列化的参考,请参阅 ,这基本上是 属性 浏览器会做的,当然没有序列化本身。
一共有三个步骤。首先,您需要解决没有结构但表示单个值(例如日期、时间或地理位置等)或简单值集合(例如矩阵)的简单自定义类型).
确保QVariant
可以承载简单类型。在接口(头文件)中的类型定义之后添加 Q_DECLARE_METATYPE
宏。
实施delegates for the types。对于具有 table 结构的类型,例如矩阵,您可以利用 QTableView
并提供一个适配器模型,将类型的内容公开为 table 模型。
其次,您将获得具有内部结构的复杂类型:
创建一个派生自复杂类型的包装器 class,使用 Q_PROPERTY
声明所有属性,并具有 Q_GADGET
宏(不是 Q_OBJECT
因为它们不是 QObjects)。这样的 class 不应该有自己的任何成员。它唯一的方法应该是可选的 属性 访问器。 Q_GADGET
宏添加静态 (class) 成员 staticMetaObject
.
如果需要,基础类型可以是 static_cast
到包装器 class,但通常没有必要。
此时,QMetaProperty
系统可以直接访问您为其编写包装器的任何 class,无需转换!您将使用包装器的 staticMetaObject
作为其静态元对象,但 QMetaProperty
readOnGadget
和 writeOnGadget
将直接将指针指向基 class。
第三,由于 ObjectPropertyBrowser
很可能没有在 Qt 5.5 中实现对小工具的支持,因为它是相当新的,您必须对其进行修改以提供此类支持。更改将是最小的,并且与使用 QMetaProperty::readOnGadget
和 QMetaProperty::writeOnGadget
而不是 QMetaProperty::read
和 QMetaProperty::write
有关。两者比较见
我正在编写一个程序,要求用户非常灵活地操作给定对象上的数据。我想我会使用某种 属性 浏览器; Qtilities 的 ObjectDynamicPropertyBrowser
引起了我的注意。
但是,我需要能够添加自己的数据类型。文档不清楚如何操作。
如何让我自己的数据类型在 Qtilities 的 属性 浏览器小部件中显示?
此外,更多关于我的需求:
- 数据类型不是 Qt 的一部分,甚至
Q_OBJECT
s 也不是。 - 对相关 类 的 Qt 特定修改不是一个选项。
- 通过
Q_DECLARE_METATYPE
声明相关的 类 没问题。 - 特别是,我需要表示向量和矩阵类型(以后可能会更多)。
您所指的浏览器依赖QObject
属性系统。所以,除非你的 classes 是 QObjects,否则它不会工作 - 但不要绝望,Qt 5.5 可以拯救(继续阅读)。浏览器似乎使用了 QTreeView
并提供了一个公开 QObject
属性 系统的适配器模型。因此,它利用了 Qt 的类型和委托系统。
在 Qt 5.5 中,有一个通用的 属性 系统,称为小工具,可以在任何 class 上使用,只要有一个 QMetaObject
描述class。通过将 Q_GADGET
宏添加到从主题 class 派生的 class,并使用 Q_PROPERTY
宏描述属性,您可以利用 moc
和小工具系统访问您未修改的类型的属性。
您这样做的唯一原因是需要对 ObjectPropertyBrowser
系统进行最少的更改。您不需要 ObjectDynamicPropertyBrowser
,因为它适用于动态属性,而您的对象没有。它们具有静态属性,通过 Q_PROPERTY
宏和 moc 生成的代码给出。
因此,您将继续为 QVariant
和一般视图实现自己的类型支持。您还需要 Qt 5.5,因为您需要小工具支持才能工作。 Qt 5.4 及更低版本的解决方案需要不同的方法,并且以其他方式实施可能不那么麻烦。
有关使用小工具 属性 系统进行对象序列化的参考,请参阅
一共有三个步骤。首先,您需要解决没有结构但表示单个值(例如日期、时间或地理位置等)或简单值集合(例如矩阵)的简单自定义类型).
确保
QVariant
可以承载简单类型。在接口(头文件)中的类型定义之后添加Q_DECLARE_METATYPE
宏。实施delegates for the types。对于具有 table 结构的类型,例如矩阵,您可以利用
QTableView
并提供一个适配器模型,将类型的内容公开为 table 模型。
其次,您将获得具有内部结构的复杂类型:
创建一个派生自复杂类型的包装器 class,使用
Q_PROPERTY
声明所有属性,并具有Q_GADGET
宏(不是Q_OBJECT
因为它们不是 QObjects)。这样的 class 不应该有自己的任何成员。它唯一的方法应该是可选的 属性 访问器。Q_GADGET
宏添加静态 (class) 成员staticMetaObject
.如果需要,基础类型可以是
static_cast
到包装器 class,但通常没有必要。此时,
QMetaProperty
系统可以直接访问您为其编写包装器的任何 class,无需转换!您将使用包装器的staticMetaObject
作为其静态元对象,但QMetaProperty
readOnGadget
和writeOnGadget
将直接将指针指向基 class。
第三,由于 ObjectPropertyBrowser
很可能没有在 Qt 5.5 中实现对小工具的支持,因为它是相当新的,您必须对其进行修改以提供此类支持。更改将是最小的,并且与使用 QMetaProperty::readOnGadget
和 QMetaProperty::writeOnGadget
而不是 QMetaProperty::read
和 QMetaProperty::write
有关。两者比较见