【问题标题】:Qt c++ class+subclass using Q_OBJECT doesn´t work使用 Q_OBJECT 的 Qt c++ 类+子类不起作用
【发布时间】:2017-05-24 23:07:26
【问题描述】:

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

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

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

  • 我必须将 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()
    {
    }
    

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

    来自documentation

    Q_OBJECT 宏必须出现在类的私有部分 声明自己的信号和槽或使用其他的定义 Qt 的元对象系统提供的服务。

    其次,Q_DECLARE_METATYPE() 要求对象有一个拷贝构造函数,而QObject 不支持拷贝构造函数按设计,所以不可能将Q_DECLARE_METATYPE() 与@987654329 一起使用@派生类。而且它也没有任何意义,因为每个QObject 都自动成为元类型,因为它正在由元对象编译器处理。如果您声明一个指向您的类型的指针 - Q_DECLARE_METATYPE(Geometry*),它将起作用。将类型注册为元类型需要该类型具有复制构造函数,如果没有,则会出现错误。

    从你的类的外观来看,它们不需要QObject派生,所以你不应该这样做,你应该删除宏(如果你是不继承QObject或派生的),然后Q_DECLARE_METATYPE(Geometry)应该可以工作。看起来您的印象是您需要 Q_OBJECTQ_DECLARE_METATYPE(),但实际上恰恰相反 - 两者不兼容 - 后者必须有,而前者不能有复制构造函数。

    【讨论】:

      【解决方案2】:

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

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

      Using the Meta-Object Compiler (moc)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        相关资源
        最近更新 更多