(1)一览
类型 | 用途 | 特点 |
---|---|---|
Q_GADGET 宏 | 定义值类型 | Q_OBJECT 宏的轻量版本 |
QList<T> | 值传递列表容器 | 类似 QVariantList,可读性更好 |
Q_PROPERTY 宏 | 定义值类型的属性 | 暴露属性 |
(2)类型
(2.1)Q_GADGET
Q_GADGET 宏是 Q_OBJECT 宏的轻量化版本,适用于不继承QObject但仍希望使用QMetaObject提供的一些反射功能的类。
像 Q_OBJECT 宏一样,它必须出现在类定义的私有部分中。
Q_GADGET 可以有Q_ENUM、Q_PROPERTY 和 Q_INVOKABLE,但不能有信号 或 槽。
作者注:Q_GADGET 宏常用于定义QML的值类型,类似于Java的VO。
(2.2)QList
QList<T>、QLinkedList<T> 和 QVector<T> 提供了类似的 API 和功能。它们通常是可互换的,但也会对性能产生影响。以下是用例概述:
- QVector 应该是默认的第一选择。QVector<T> 通常会比 QList<T> 提供更好的性能,因为 QVector<T> 总是按顺序将其项存储在内存中,其中 QList<T> 将在堆上分配其项,除非 sizeof(T) <= sizeof(void*),并且 T 已使用 Q_DECLARE_TYPEINFO 声明为 Q_MOVABLE_TYPE或 Q_PRIMINIVE_TYPE。
- QList 适用于配合 Qt API 使用、用于传递参数和返回值。
- 如果需要一个真正的链表,请使用 QLinkedList:它可以保证在列表中间进行恒定的时间插入,并对项而不是索引使用迭代器。
作者注:QML中常用的容器除了QStringList就属QList了
(2.3)Q_PROPERTY
Q_PROPERTY 宏用于声明继承 QObject 的类中的属性。属性的行为类似于类数据成员,但它们具有可通过元对象系统访问的附加功能。
Q_PROPERTY(type name READ getter [WRITE setter] [NOTIFY notifySignal])
属性名称(name)和类型(type)以及 READ 函数是必需的。
类型可以是 QVariant 支持的任何类型,也可以是用户定义的类型。
其他项目是可选的,但 WRITE 函数是常见的。
作者注:
- 用户自定义类型,需要使用 Q_DECLARE_METATYPE 申明。
- 是否需要 WRITE 取决于业务逻辑:是否需要前端(qml)传值。
- 对于信号的触发,建议在 setter 中显式地 emit <signal>。