我已经搜索了很多这个话题,并且已经找到了一些方法,但是我发现了一些错误,我找不到原因。
想法是用QMetaEnum读取枚举中的键,以便稍后在组合框中填充字符串。
我已经有了枚举,并且在枚举所在的类中设置了Q_Object和Q_Enum宏。但是,通过使用metaObject,我得到了“对'Planet::metaObject() const‘的未定义引用”错误消息。
这是行星。
#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的星球,但它也没有解决这个问题。
如果能得到一些帮助,或者进一步解释一下QMetaEnum的用法,那就太酷了。
编辑:它也给了我一个错误,说:未定义的引用‘’,如果这有助于了解这个问题的来源。
Edit2:我已经找到了这个“vtable”问题,但是它也不能解决这个错误。Qt undefined reference to vtable
发布于 2021-06-12 07:46:44
我找到了我问题的答案。
当我研究这个vtable问题时,我找到了这篇文章。C++ - Undefined reference to `vtable
我试了一试,把Q_Object宏从类中删除了。然后两个错误都消失了
编辑:这解决不了它!但是您可以在这里找到解决方案:QMetaEnum does not read keys from enum,当我发布第二篇文章时,我并不知道这两个问题是相互关联的。
发布于 2021-06-11 10:53:04
包括QMetaEnum和从QObject派生的内容通常都很有用:
#include <QMetaEnum>
class Planet : public QObject
{
Q_OBJECT
public: 其他一切看起来都很好(乍一看)。
发布于 2021-06-12 18:55:48
对此只有两种可能的解释:
moc实用程序不会被调用来处理包含Planet的头文件,不管是什么原因(错误的时间戳阻止了第二次执行它,并且有旧版本的moc_planet.h,文件没有添加到项目中,也不在makefile规则中,还有标头的重复)Planet类的空vtable .在这种情况下,任何没有内联声明的虚拟函数,例如~Planet();,在.cpp中定义了主体,都可以。。
https://stackoverflow.com/questions/67934821
复制相似问题