[英]Qt c++ class+subclass using Q_OBJECT doesn´t work
我在使用 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() { }
如果你想使用Q_OBJECT
你的类应该继承自QObject
或其子类
class Geometry : public QObject
{
Q_OBJECT
//...
首先, Q_OBJECT
宏是不可继承的。 它必须包含在每个直接或间接继承QObject
对象中。 如果您的基类是QObject
派生的,那么您的派生类也是QObject
派生的,因此必须包含宏。
从文档:
Q_OBJECT 宏必须出现在声明自己的信号和槽或使用 Qt 元对象系统提供的其他服务的类定义的私有部分中。
其次, Q_DECLARE_METATYPE()
要求对象有一个拷贝构造函数,和QObject
设计不支持拷贝构造函数,所以它是不可能使用Q_DECLARE_METATYPE()
用QObject
派生类。 这也没有意义,因为每个QObject
自动是元类型,因为它正在由元对象编译器处理。 如果您声明一个指向您的类型的指针 - Q_DECLARE_METATYPE(Geometry*)
,它将起作用。 将类型注册为元类型需要该类型具有复制构造函数,如果没有,则会出现错误。
从您的类的外观来看,它们不需要从QObject
派生,因此您不应该这样做,您应该删除宏(如果您不是继承QObject
或派生的,则不要使用它),然后Q_DECLARE_METATYPE(Geometry)
应该工作。 看起来你的印象是你需要Q_OBJECT
到Q_DECLARE_METATYPE()
但实际上它是相反的 - 两者不兼容 - 后者必须有,而前者不能有复制构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.