2017-01-10 2 views
-1

I`m arbeiten die härteste Zeit mit einer Klasse + Unterklasse mit Q_OBJECT bei der Erstellung:Qt C++ Klasse + Unterklasse mit Q_OBJECT Passt nicht

Ich habe eine Klasse Geometrie und einige Klassen Geo_1PF, Geo_2, .. die von Geometrie erben. Ich habe diese Klassen erstellt und alles hat gut funktioniert. Jetzt möchte ich QMetaType verwenden und dafür muss ich Q_Object deklarieren. Sobald ich Q_OBJECT/Q_DECLARE_METATYPE verwendet habe, begannen meine Probleme.

erhalte ich die Fehler „undefined reference Vtable ...“ Ich habe versucht, alle .o und alle moc_ CPP vor dem Kompilieren wieder zu löschen. Ich fügte hinzu QT + = Kern in der * .pro-Datei, aber ich war nicht erfolgreich. Q_OBJECT/Q_DECLARE_METATYPE in setzen sowohl die Eltern und die cild Klasse

  • Muss ich?
  • Warum bekomme ich diesen Fehler?

Kann mir bitte jemand helfen?

Dies ist mein Code:

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

Antwort

1

Zuerst wird das Q_OBJECT Makro ist nicht vererbbar Siehe inherites sollte. Sie muss in jedem Objekt enthalten sein, das direkt oder indirekt QObject erbt. Wenn Ihre Basisklasse QObject abgeleitet ist, wird Ihre abgeleitete Klasse ebenfalls QObject abgeleitet und muss daher das Makro enthalten.

Vom documentation:

Das Q_OBJECT Makro im privaten Bereich einer Klasse Definition erscheinen muß, die ihre eigenen Signale und Slots erklärt oder dass andere Anwendungen Dienste von Qt Meta-Objekt-System zur Verfügung gestellt.

Zweitens erfordert Q_DECLARE_METATYPE(), dass das Objekt eine Kopie Konstruktor hat, und QObject nicht Kopierkonstruktoren nach Design, so dass es unmöglich ist, zu verwenden Q_DECLARE_METATYPE() mit einer QObject abgeleiteten Klasse unterstützen. Und es ergibt auch keinen Sinn, denn jeder QObject ist automatisch ein Meta-Typ, da er vom Meta-Objekt-Compiler verarbeitet wird. Es funktioniert, wenn Sie einen Zeiger auf Ihren Typ deklarieren - Q_DECLARE_METATYPE(Geometry*). Wenn Sie einen Typ als Metatyp registrieren, muss der Typ über einen Kopierkonstruktor verfügen, wenn Sie keinen Fehler erhalten.

Von den Blicken Ihrer Klassen, sie nicht brauchen von QObject abzuleiten, so dass Sie das nicht tun sollten, dann sollten Sie das Makro entfernen (und es nie verwenden, wenn Sie sind nicht ein QObject vererben oder abgeleitet), und dann Q_DECLARE_METATYPE(Geometry) sollte funktionieren. Es sieht so aus, als ob du unter dem Eindruck hättest, dass du Q_OBJECT zu Q_DECLARE_METATYPE() brauchst, aber in Wirklichkeit ist es das Gegenteil - die beiden sind inkompatibel - das letztere muss haben und das ehemalige muss keinen Kopierkonstruktor haben.

Verwandte Themen