Qtilities:属性 浏览器的自定义 属性 类型?

Qtilities: Custom property types for the property browsers?

我正在编写一个程序,要求用户非常灵活地操作给定对象上的数据。我想我会使用某种 属性 浏览器; Qtilities 的 ObjectDynamicPropertyBrowser 引起了我的注意。

但是,我需要能够添加自己的数据类型。文档不清楚如何操作。

如何让我自己的数据类型在 Qtilities 的 属性 浏览器小部件中显示?

此外,更多关于我的需求:

您所指的浏览器依赖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 及更低版本的解决方案需要不同的方法,并且以其他方式实施可能不那么麻烦。

有关使用小工具 属性 系统进行对象序列化的参考,请参阅 ,这基本上是 属性 浏览器会做的,当然没有序列化本身。

一共有三个步骤。首先,您需要解决没有结构但表示单个值(例如日期、时间或地理位置等)或简单值集合(例如矩阵)的简单自定义类型).

  1. 确保QVariant可以承载简单类型。在接口(头文件)中的类型定义之后添加 Q_DECLARE_METATYPE 宏。

  2. 实施delegates for the types。对于具有 table 结构的类型,例如矩阵,您可以利用 QTableView 并提供一个适配器模型,将类型的内容公开为 table 模型。

其次,您将获得具有内部结构的复杂类型:

  1. 创建一个派生自复杂类型的包装器 class,使用 Q_PROPERTY 声明所有属性,并具有 Q_GADGET 宏(不是 Q_OBJECT 因为它们不是 QObjects)。这样的 class 不应该有自己的任何成员。它唯一的方法应该是可选的 属性 访问器。 Q_GADGET 宏添加静态 (class) 成员 staticMetaObject.

  2. 如果需要,基础类型可以是 static_cast 到包装器 class,但通常没有必要。

  3. 此时,QMetaProperty 系统可以直接访问您为其编写包装器的任何 class,无需转换!您将使用包装器的 staticMetaObject 作为其静态元对象,但 QMetaProperty readOnGadgetwriteOnGadget 将直接将指针指向基 class。

第三,由于 ObjectPropertyBrowser 很可能没有在 Qt 5.5 中实现对小工具的支持,因为它是相当新的,您必须对其进行修改以提供此类支持。更改将是最小的,并且与使用 QMetaProperty::readOnGadgetQMetaProperty::writeOnGadget 而不是 QMetaProperty::readQMetaProperty::write 有关。两者比较见