如何从 QMetaType 获取结构体成员的名称?

问题描述 投票:0回答:3

我有:

struct myStruct {
    int m_valueA;
    float m_valueA;
    bool m_valueA;
};
Q_DECLARE_METATYPE(myStruct)

....

struct myStructXY {
    ....
};
Q_DECLARE_METATYPE(myStructXY)

我可以从

QMetaEnum
获取枚举名称:

Q_ENUM(myEnum)
QMetaEnum enumTypes QMetaEnum::fromType<myEnum>();

QMap<qint32, QString> labelsMap;
for(int i = 0; i < enumTypes.keyCount(); i++)
{
    QString enumName = QString(enumTypes.key(i));
    labelsMap.insert(enumTypes.value(i), enumName);
}

我想从元类型中动态收集

myStruct
成员名称和类型,类似于之前的枚举情况。 喜欢:

QMetaObject structType;
QStringList list = getStructMemberNames(structType);

Qt 有选项可以做到这一点吗? 我已经搜索了 QMetaType 但我需要更多的力量来做到这一点。

c++ qt enums metadata
3个回答
2
投票

我认为在 Qt 中没有任何方法可以做到这一点。

最接近的是 QMetaObject,它公开信号、槽和属性;属性可以被视为公开成员变量,但这并不完全是您所要求的。

另请注意,仅当您在 moc 处理的 QObject 类中使用 Q_ENUM 时,QMetaEnum 才有效。因此,要使用结构制作类似的东西,它只能使用 QObjects 内部的结构并使用 Q_STRUCT 进行声明,但到目前为止,这还不存在。


1
投票

如何从 QMetaType 获取结构体成员的名称?

一开始就不使用 Qt,因为

moc
不支持生成此类元数据。就这样。如果您愿意,您可以修补
moc
来为您完成此操作,但开箱即用的它不起作用。通过从 clang 获取 AST,从中生成一些元数据记录并将其添加到代码中,您可能会取得更大的成功。


0
投票

您可以使用 Q_GADGET 宏代替 Q_OBJECT,这将为您提供 QMetaObject 和 QT 属性系统的反射功能,而无需子类化 QObject。

//header struct MyStruct { Q_GADGET Q_PROPERTY(int myMember MEMBER myMember) public: MyStruct(int integer = 0) : myMember (integer) {} int myMember; };

注意:Q_GADET 仅在我机器上的标头中使用时才编译

//implementation const QMetaObject metaObj = MyStruct::staticMetaObject; QStringList properties; for(int i = 0; i < metaObj.propertyCount(); i++) properties << metaObj.property(i).name(); qDebug() << properties; //outputs: QList("myMember")

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.