Qt5.15中Q_PROPERTY仅写无READ告警且MEMBER关键字不识别如何解决
问题原因
- 初始告警触发逻辑:Qt元对象系统要求每个
Q_PROPERTY定义的属性必须关联读取入口,要么指定READ访问器,要么通过MEMBER绑定类内部的成员变量,二者至少满足其一,否则属性无法被元系统识别,就会抛出你遇到的无效属性告警。 - 加
MEMBER后编译报错的原因:你写错了Q_PROPERTY的参数顺序,MEMBER关键字必须放在属性名之后,不能插在类型和属性名之间,错误的参数位置会让moc编译器无法识别MEMBER关键字,因此抛出未知关键字错误。
解决方案
你不需要定义对外暴露的READ访问器,以下两种方案都可以满足需求:
方案1:修正MEMBER写法(推荐,无冗余代码)
首先在类中定义对应的私有成员变量,再调整Q_PROPERTY的参数顺序即可:
// 类私有区域先定义成员变量 private: QVariantList m_sortCriteries; // 修正后的Q_PROPERTY写法 Q_PROPERTY(QVariantList sortCriteries MEMBER m_sortCriteries WRITE setSortCriteries)
MEMBER后接类内部的成员变量名,和前面的属性名可以不一致,你只要自行对应即可。这种写法下Qt元系统会自动绑定属性和成员变量,不需要额外写READ方法,也不会触发告警,你定义的setSortCriteries写入方法可以正常使用。
方案2:加私有空READ方法(适合不需要额外存储成员变量的场景)
如果你的setSortCriteries内部已经自行维护了属性逻辑,不需要额外存储对应的成员变量,可以加一个私有的空READ访问器,不会对外暴露:
// 类私有区域加空的读取方法 private: QVariantList dummySortCriteriesRead() const { return {}; } // 对应的Q_PROPERTY写法 Q_PROPERTY(QVariantList sortCriteries READ dummySortCriteriesRead WRITE setSortCriteries)
因为READ方法是私有属性,外部无法调用,完全不会影响你的功能限制,也可以直接消除告警。
内容的提问来源于stack exchange,提问作者curiousJorgeXX
相关产品推荐
相关产品推荐

