- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序,要求用户非常灵活地操作给定对象上的数据。我想我会使用某种属性浏览器; Qtilities' ObjectDynamicPropertyBrowser
引起了我的注意。
但是,我需要能够添加自己的数据类型。文档不清楚如何执行此操作。
如何让我自己的数据类型在 Qtilities 的属性浏览器小部件中表示?
此外,更多关于我的需求:
Q_OBJECT
。Q_DECLARE_METATYPE
声明相关类。最佳答案
您引用的浏览器取决于 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有关使用小工具属性系统进行对象序列化的引用,它基本上是属性浏览器将执行的操作,当然没有序列化本身。
分为三个步骤。首先,您需要解决没有结构但表示单个值(例如日期、时间或地理位置等)或简单值集合(例如矩阵)的简单自定义类型).
确保QVariant
可以承载简单类型。在接口(interface)(头文件)中的类型定义之后添加 Q_DECLARE_METATYPE
宏。
实现 delegates for the types .对于具有表结构的类型,例如矩阵,您可以利用 QTableView
并提供一个适配器模型,将类型的内容公开为表模型。
其次,您将获得具有内部结构的复杂类型:
创建一个派生自复杂类型的包装类,使用 Q_PROPERTY
声明所有属性,并具有 Q_GADGET
宏(不是 Q_OBJECT
因为它们不是 QObjects)。这样的类不应该有自己的任何成员。它唯一的方法应该是可选的属性访问器。 Q_GADGET
宏添加静态(类)成员 staticMetaObject
。
如果需要,底层类型可以是 static_cast
到包装类,但这通常不是必需的。
此时,QMetaProperty
系统可以直接访问您为其编写包装器的任何类,无需转换!您将使用包装器的 staticMetaObject
作为其静态元对象,但 QMetaProperty
readOnGadget
和 writeOnGadget
将直接获取指向基类的指针。
第三,由于 ObjectPropertyBrowser
很可能没有在 Qt 5.5 中实现对小工具的支持,因为这是相当新的,您必须修改它以提供此类支持。更改将是最小的,并且与使用 QMetaProperty::readOnGadget
和 QMetaProperty::writeOnGadget
而不是 QMetaProperty::read
和 QMetaProperty::write
。查看serialization answer两者比较。
关于c++ - Qtilities : Custom property types for the property browsers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929990/
我正在编写一个程序,要求用户非常灵活地操作给定对象上的数据。我想我会使用某种属性浏览器; Qtilities' ObjectDynamicPropertyBrowser引起了我的注意。 但是,我需要能
我是一名优秀的程序员,十分优秀!