繁体   English   中英

使用 Q_OBJECT 的 Qt C++ 类+子类不起作用

[英]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但我没有成功。

  • 我是否必须将 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: #include "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()但实际上它是相反的 - 两者不兼容 - 后者必须有,而前者不能有复制构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM