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