使用 QMetaEnum 将枚举转换为字符串

Converting enum into String using QMetaEnum

我已经为这个主题搜索了很多并且已经找到了一些方法但是我遇到了一些错误我找不到它的原因。

想法是使用 QMetaEnum 从枚举中读取键,以便稍后在组合框中填充字符串。

我已经有了枚举,还在枚举所在的 class 中设置了 Q_Object 和 Q_Enum 宏。但是我通过使用 QMetaEnum 收到“对 'Planet:: metaObject() const' 的未定义引用”错误消息。

这里是planet.h

#include <QMetaEnum>
class Planet
{
    Q_OBJECT
public:    
    enum PlanetTypes
    {
       Barren,Gas,Ice,Lava,Oceanic,Plasma,Storm,Temperate
    };Q_ENUM(PlanetTypes)
    Planet();
    //some getters and setters for my private member-variables
};

这是我尝试读取枚举并收到错误消息的片段。

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 = metaObj->enumerator(metaObj->indexOfEnumerator("PlanetTypes"));

我什至尝试从 QObject 继承 planet 但它也没有解决问题。

如果能得到一些帮助以及对 QMetaEnum 用法的一些进一步解释,那就太好了。

编辑:它还给我一个错误提示:对 'vtable for Planet' 的未定义引用,如果这有助于以某种方式了解此问题的来源。

编辑2: 我在 'vtable' 问题上找到了这个,但它也没有解决这个错误。 Qt undefined reference to vtable

包括 QMetaEnum 并派生自 QObject 通常可以达到目的:

#include <QMetaEnum>
class Planet : public QObject
    {
        Q_OBJECT
    public: 

其他一切看起来都很好(乍一看)。

我找到了问题的答案。

在研究这个 vtable 问题时,我发现了这个 post。 C++ - Undefined reference to `vtable

我试了一下并从 class 中删除了 Q_Object 宏。 然后两个错误都消失了

编辑:这并没有解决它!但是您可以在这里找到解决方案: 因为我做了第二个 post 我不知道这两个问题是相互关联的。

只有两种可能的解释:

  1. moc 实用程序未被调用来处理包含 Planet 的 header 文件,无论出于何种原因(错误的时间戳阻止它第二次执行和moc_planet.h 的旧版本,文件未添加到项目中且不在 makefile 规则中,存在 header)

    的副本
  2. 编译器 optimized-out Planet class 的空 vtable。在这种情况下,任何未声明为内联的虚函数,例如~Planet(); 与在 .cpp 中定义的 body 一样。