使用Q_OBJECT的Qt c ++ class + subclass不起作用

时间:2017-01-10 12:45:48

标签: c++ qt

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

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

我收到错误“对vtable的未定义引用...” 在再次编译之前,我尝试删除所有 .o和所有moc _ .cpp。我在* .pro-File中添加了 QT + = core ,但我没有成功。

  • 我是否必须在父类和cild类中放置Q_OBJECT / Q_DECLARE_METATYPE?
  • 为什么我会收到错误?

有人可以帮帮我吗?

这是我的代码:

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()
    {
    }
    

2 个答案:

答案 0 :(得分:5)

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

class Geometry : public QObject
{
    Q_OBJECT

//...

请参阅Using the Meta-Object Compiler (moc)

答案 1 :(得分:1)

首先,Q_OBJECT不可继承。它必须包含在直接或间接继承QObject的每个对象中。如果您的基类是QObject派生的,那么派生类也是QObject派生的,因此必须包含宏。

来自documentation

  

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的印象,但实际上它是相反的 - 两者是不相容的 - 后者必须具有,而前者必须没有复制构造函数。