2017-01-10 5 views
-1

I`mを使用して:QtのC++クラス+サブクラスQ_OBJECTを使用して、クラス+サブクラスを作成する上で最も困難な時間持つQ_OBJECT doesn't仕事

を私は、クラスジオメトリといくつかのクラスGeo_1PF、GeO_2系を持っています..それはジオメトリから継承します。私はすべてがうまくいったクラスを作りました。今私はQMetaTypeを使いたいので、Q_Objectを宣言する必要があります。 Q_OBJECT/Q_DECLARE_METATYPEを使用すると、問題が発生しました。

私は再びコンパイルする前に、すべてのの.oおよびすべてのmoc_ .cppファイルを削除しようとしましたエラー「のためにvtableのための未定義参照...」 を取得します。私はQT + =コアを* .pro-Fileに追加しましたが、成功しませんでした。

  • 親クラスと子供クラスの両方に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() 
    { 
    } 
    

答えて

5

あなたがQ_OBJECTあなたのクラスを使用する場合はQObjectまたはそのサブクラス

class Geometry : public QObject 
{ 
    Q_OBJECT 

//... 

からinheritesはまず、Q_OBJECTマクロが継承ないUsing the Meta-Object Compiler (moc)

1

を参照してくださいする必要があります。 QObjectを直接的または間接的に継承するすべてのオブジェクトに含める必要があります。基底クラスがQObjectである場合、派生クラスも導出されたQObjectであるため、マクロを含める必要があります。 documentationから

Q_OBJECTマクロは、独自のシグナルとスロットを宣言したりそれはQtのメタオブジェクトシステムによって提供される他の サービスを使用するクラス 定義のプライベートセクションに表示されなければなりません。

第二に、Q_DECLARE_METATYPE()は、オブジェクトがコピーコンストラクタを持っていることを必要とし、QObjectは、設計でコピーコンストラクタをサポートしていないので、QObject派生クラスでQ_DECLARE_METATYPE()を使用することは不可能です。また、QObjectはメタオブジェクトコンパイラによって処理されているため、自動的にメタタイプになるため、意味がありません。あなたのタイプへのポインタを宣言するとうまくいくでしょう - Q_DECLARE_METATYPE(Geometry*)。タイプをメタタイプとして登録するには、タイプがコピーコンストラクタを持つ必要があります(エラーが発生しない場合)。あなたのクラスのルックスから

、彼らはあなたがそれを行うべきではありませんので、あなたがマクロを削除しない(と決してあなたがないが継承されている場合は、それを使用する必要があり、QObjectから派生するを必要としないQObjectか派生した)、そしてQ_DECLARE_METATYPE(Geometry)はうまくいくはずです。 Q_OBJECTQ_DECLARE_METATYPE()が必要な印象を受けていたようですが、現実には反対です.2つは互換性がありません。後者はコピーコンストラクタを持つ必要があります。

関連する問題