Qt c++ 类 + 子类使用 Q_OBJECT 不起作用

Qt c++ class+subclass using Q_OBJECT doesn´t work

本文关键字:OBJECT 不起作用 c++ 子类 Qt      更新时间:2023-10-16

我在使用Q_OBJECT:创建类+子类时遇到了最困难的时候

我有一个类几何和一些类Geo_1PF,Geo_2,。。继承自几何体的。我创建了这些类,一切都很好。现在我想使用QMetaType,为此我需要声明Q_Object。一旦我使用了Q_OBJECT/Q_DECLARE_METATYPE,我的问题就开始了。

我得到错误"对vtable的未定义引用…">在再次编译之前,我尝试删除所有.o和所有moc_.cpp。我在*.pro文件中添加了QT+=core,但没有成功。

  • 是否必须将Q_OBJECT/Q_DECLARE_METATYPE放在父类和cild类中
  • 为什么会出现此错误

有人能帮我吗?

这是我的代码:

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:#包括"Geo_1PF.h">

    Geo_1PF::Geo_1PF()
    {
    }
    

如果您想使用Q_OBJECT,您的类应该继承自QObject或其子类

class Geometry : public QObject
{
Q_OBJECT
//...

请参阅使用元对象编译器(moc)

首先,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_OBJECTQ_DECLARE_METATYPE(),但事实恰恰相反——两者不兼容——后者必须有,前者不能有复制构造函数。