QMetaEnum 不从枚举中读取键
QMetaEnum does not read keys from enum
为什么我的代码不从我的枚举中读取我指定的键。
代码本身编译良好,程序运行时没有任何运行时错误。
带有枚举的头文件:
#include <QMetaEnum>
class Planet: public QObject
{
public:
enum PlanetTypes
{
Barren,Gas,Ice,Lava,Oceanic,Plasma,Storm,Temperate
};Q_ENUM(PlanetTypes)
Planet();
//some getters and setters for my private membervariables
}
这是数据模型中的方法,我使用 QMetaEnum
读取枚举
QStringList DataModel::getPlanetTypes()
{
QStringList PlanetTypesList;
Planet p;
const QMetaObject* metaObj = p.metaObject();
QMetaEnum e = metaObj->enumerator(metaObj->indexOfEnumerator("PlanetTypes"));
for(int i=0; i<e.keyCount();i++)
{
PlanetTypesList.append(e.key(i));
}
return PlanetTypesList;
}
调试显示 QMetaEnum e 没有找到 Enumerator。 for 循环永远不会运行。
但是没有编译器或运行时错误。
我实际上不知道为什么它找不到枚举或其键。
你错过了一件重要的事情:
class Planet: public QObject
{
Q_OBJECT
并且 class 应该有非空虚表,例如至少
~Planet(); // can be empty but should not be inlined
}
如果没有 Q_OBJECT 或 Q_GADGET 宏,元对象编译器 (MOC) 实用程序根本不会扫描您的 class。因此,它生成的代码将不包含会形成和初始化您想要存在的 QMetaEnum 实例的代码。实际上,如果没有该宏,将不会声明特定于 Planet 的元对象,它将继承 QObject 的元对象。
确保在添加后重新运行 qmake,否则可能会遇到链接错误。
顺便说一句,如果您不需要 class 的实例,则可以使用 Planet::staticMetaObject
。
为什么我的代码不从我的枚举中读取我指定的键。
代码本身编译良好,程序运行时没有任何运行时错误。
带有枚举的头文件:
#include <QMetaEnum>
class Planet: public QObject
{
public:
enum PlanetTypes
{
Barren,Gas,Ice,Lava,Oceanic,Plasma,Storm,Temperate
};Q_ENUM(PlanetTypes)
Planet();
//some getters and setters for my private membervariables
}
这是数据模型中的方法,我使用 QMetaEnum
读取枚举 QStringList DataModel::getPlanetTypes()
{
QStringList PlanetTypesList;
Planet p;
const QMetaObject* metaObj = p.metaObject();
QMetaEnum e = metaObj->enumerator(metaObj->indexOfEnumerator("PlanetTypes"));
for(int i=0; i<e.keyCount();i++)
{
PlanetTypesList.append(e.key(i));
}
return PlanetTypesList;
}
调试显示 QMetaEnum e 没有找到 Enumerator。 for 循环永远不会运行。
但是没有编译器或运行时错误。
我实际上不知道为什么它找不到枚举或其键。
你错过了一件重要的事情:
class Planet: public QObject
{
Q_OBJECT
并且 class 应该有非空虚表,例如至少
~Planet(); // can be empty but should not be inlined
}
如果没有 Q_OBJECT 或 Q_GADGET 宏,元对象编译器 (MOC) 实用程序根本不会扫描您的 class。因此,它生成的代码将不包含会形成和初始化您想要存在的 QMetaEnum 实例的代码。实际上,如果没有该宏,将不会声明特定于 Planet 的元对象,它将继承 QObject 的元对象。
确保在添加后重新运行 qmake,否则可能会遇到链接错误。
顺便说一句,如果您不需要 class 的实例,则可以使用 Planet::staticMetaObject
。