我在使用Q_OBJECT创建类+子类时遇到了最困难的时间:
我有一个类几何和一些从几何继承的类 Geo_1PF ,Geo_2,..我创建了这些类,一切运作良好。现在我想使用QMetaType,为此我需要声明Q_Object。 一旦我使用Q_OBJECT / Q_DECLARE_METATYPE,我的问题就开始了。
我收到错误“对vtable的未定义引用...” 在再次编译之前,我尝试删除所有 .o和所有moc _ .cpp。我在* .pro-File中添加了 QT + = core ,但我没有成功。
有人可以帮帮我吗?
这是我的代码:
geometry.h:
#ifndef GEOMETRY_H
#define GEOMETRY_H
#include <QMetaType>
#include <QWidget>
#include <QObject>
#include <QDebug>
class Geometry
{
// Q_OBJECT
protected:
public:
Geometry();
virtual ~Geometry(void) {}
virtual void write_LNE();
//Q_DECLARE_METATYPE(Geometry);
#endif // GEOMETRY_H
-
geometry.cpp:
#include "geometry.h"
Geometry::Geometry()
{ qDebug() << "Constructor: hier ist Geometry"; }
void Geometry::Haupt()
{ qDebug() << " Das hier ist die Haupt von Geometry ....." ; }
void Geometry::write_LNE(){}
-
Geo_1PF.h:
#ifndef GEO_1PF_H
#define GEO_1PF_H
#include "geometry.h"
class Geo_1PF : public Geometry
{
// Q_OBJECT
public:
Geo_1PF();
~Geo_1PF() {}
virtual void write_LNE();
};
//Q_DECLARE_METATYPE(Geo_1PF);
#endif // GEO_1PF_H
Geo_1PF.cpp: #include“Geo_1PF.h”
Geo_1PF::Geo_1PF()
{
}
答案 0 :(得分:5)
如果您想使用Q_OBJECT
,您的班级应该继承自QObject
或其子类
class Geometry : public QObject
{
Q_OBJECT
//...
答案 1 :(得分:1)
首先,Q_OBJECT
宏不可继承。它必须包含在直接或间接继承QObject
的每个对象中。如果您的基类是QObject
派生的,那么派生类也是QObject
派生的,因此必须包含宏。
Q_OBJECT宏必须出现在类的私有部分中 声明自己的信号和插槽或使用其他信号的定义 Qt的元对象系统提供的服务。
其次,Q_DECLARE_METATYPE()
要求对象具有复制构造函数,并且QObject
不支持复制构造函数按设计,因此无法使用{带有Q_DECLARE_METATYPE()
派生类的{1}}。并且它也没有意义,因为每个QObject
都自动为元类型,因为它由元对象编译器处理。如果您声明指向类型的指针 - QObject
,它将起作用。将类型注册为元类型要求类型具有复制构造函数,如果它没有出现错误。
从课程的外观来看,他们不需要从Q_DECLARE_METATYPE(Geometry*)
派生,所以你不应该这样做,你应该删除宏(并且永远不要使用它)如果您不继承QObject
或派生的),那么QObject
应该有效。看起来你需要Q_DECLARE_METATYPE(Geometry)
到Q_OBJECT
的印象,但实际上它是相反的 - 两者是不相容的 - 后者必须具有,而前者必须没有复制构造函数。