c++ - Qtilities : Custom property types for the property browsers?

标签 c++ qt qproperty

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

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

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

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

  • 数据类型不是 Qt 的一部分,甚至也不是 Q_OBJECT
  • 不能选择对相关类进行特定于 Qt 的修改。
  • 可以通过Q_DECLARE_METATYPE 声明相关类。
  • 特别是,我需要表示 vector 和矩阵类型(以后可能会更多)。

最佳答案

您引用的浏览器取决于 QObject 属性系统。所以,除非你的类是 QObjects,否则它不会工作 - 但不要绝望,Qt 5.5 可以拯救(继续阅读)。浏览器似乎使用了 QTreeView 并提供了一个公开 QObject 属性系统的适配器模型。因此,它利用了 Qt 的类型和委托(delegate)系统。

在 Qt 5.5 中,有一个通用属性系统,称为小工具,可以用于任何类,只要有描述该类的 QMetaObject 即可。通过将 Q_GADGET 宏添加到从主题类派生的类,并使用 Q_PROPERTY 宏描述属性,您可以利用 moc 和小工具系统访问未修改类型的属性。

您这样做的唯一原因是需要对 ObjectPropertyBrowser 系统进行最少的更改。您不需要 ObjectDynamicPropertyBrowser,因为它适用于动态属性,而您的对象没有。它们具有静态属性,通过 Q_PROPERTY 宏和 moc 生成的代码给出。

因此,您将继续为 QVariant 和一般 View 实现您自己的类型支持。您还需要 Qt 5.5,因为您需要小工具支持才能工作。 Qt 5.4 及更低版本的解决方案需要不同的方法,并且以其他方式实现可能不那么麻烦。

参见 this answer有关使用小工具属性系统进行对象序列化的引用,它基本上是属性浏览器将执行的操作,当然没有序列化本身。

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

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

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

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

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

  2. 如果需要,底层类型可以是 static_cast 到包装类,但这通常不是必需的。

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

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

关于c++ - Qtilities : Custom property types for the property browsers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929990/

相关文章:

c++ - Q_PROPERTY 与私有(private)二传手

c++ - 阅读 QML 中结构的 C++ QVector

c++ - 如何捕获通过 Q_PROPERTY 发出的信号?

c++ - 没有什么可发布的,八叉树是空的

qt - 如何在Qt中为不同的按钮设置不同的图标?

c++ - 非类模板已经声明为类模板

python - 接近重构

c++ - QObject::connect 参数太多

c++ - 如何定义递归类型?

c++ - 如何添加此代码以使用我的 arduino 打印一个完整的三角形?