我有:
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 但我需要更多的力量来做到这一点。
我认为在 Qt 中没有任何方法可以做到这一点。
最接近的是 QMetaObject,它公开信号、槽和属性;属性可以被视为公开成员变量,但这并不完全是您所要求的。
另请注意,仅当您在 moc 处理的 QObject 类中使用 Q_ENUM 时,QMetaEnum 才有效。因此,要使用结构制作类似的东西,它只能使用 QObjects 内部的结构并使用 Q_STRUCT 进行声明,但到目前为止,这还不存在。
您可以使用 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")