QT Q_MOC_RUN



  • Hi leute

    ich habe einen Header ( enthalten ist eine Klasse ), der aus einem framework stammt, welches ich in meinen QT-Projekt verwende. Dieses framework ist aber nicht visuell, d.h. es hat mit QT nix zu tun. Nun möchte ich ein Objekt dieser Klasse über die Signal-Slot-Mechanik transportieren und muss es dafür mit Q_DECLARE_METATYPE anmelden.

    #ifdef Q_MOC_RUN
        #include <QMetaType>
    #endif
    
    class MyClass
    {
    ...
    };
    
    #ifdef Q_MOC_RUN
        Q_DECLARE_METATYPE(MyClass );
    #endif
    

    Und das register ist dann hier:

    #include <QMetaType>
    #include "myclass.h"
    
    int main(int argc, char *argv[])
    {
        qRegisterMetaType<MyClass> ();
    ...
    }
    

    Leider schlägt "qRegisterMetaType" dann hinterher fehl, mit dem Hinweis, dass ich doch bitte Q_DECLARE_METATYPE benutzen sollte...

    Wenn ich die Compilerweiche kurz auskommentiere, dann compiliert es! Aber der Header muss für andere Nicht-QT-Projekte compilierbar bleiben, daher muss eine Weiche her oder eine bessere Lösung.

    Was ist hier mein Fehler? Wird "Q_MOC_RUN" überhaupt gesetzt?



  • Du kannst ja mal

    #ifdef Q_MOC_RUN
        #include <QMetaType>
    #else
       #error "Q_MOC_RUN not set!"
    #endif
    

    unter Qt kompilieren lassen. Wenn das durchläuft, dann ist noch etwas anderes falsch.



  • Kompiliert nicht.
    Ich versuch mal noch ein älteres Kit... hab aktuell das 5.9.2



  • Dann probiere mal

    #ifndef Q_MOC_RUN
      #error "Q_MOC_RUN not set!"
    #else
      #include <QMetaType>
    #endif
    

    (wie in Using the Meta-Object Compiler (moc) beschrieben)

    PS: Ich habe gerade im Internet Verdigris: Qt without moc gefunden...



  • @Th69 sagte in QT Q_MOC_RUN:

    #ifndef Q_MOC_RUN
    #error "Q_MOC_RUN not set!"
    #else
    #include <QMetaType>
    #endif

    Kompiliert wie erwartet auch nicht.

    Auf dem 5.7.1 Framework gehts übrigens auch nicht. Genau wie 5.9.2.
    Sehr merkwürdig.

    Ich studiere erstmal deine Links. Dennoch bin ich verwundert, weil das Q_MOC_RUN eigentlich gesetzt sein müsste... Theoretisch.



  • Deine Weiche ist schlicht falsch.
    Q_DECLARE_METATYPE ist nicht vom moc abhängig. Es definiert einfach eine definition von QMetaTypeId für den übergebenen typ. Und dieser Typ wird auch benötigt, wenn der code vom compiler übersetzt wird, da der vom moc generierte code vermutlich diesen definition referenziert

    Du musst dir eine andere Weiche ausdenken um zwischen Qt build und ohne unterscheiden zu können.

    Q_MOC_RUN wird von moc selbst definiert, wenn es über den code geht.



  • @firefly
    Was wäre denn die "richtige" Weiche?

    Was ich nicht unbedingt machen will: eine eigene Weiche definieren, denn wenn man recyclebaren Code baut und den dann in einem neuen Projekt verwenden will, vergisst man solche Weichen gerne mal, daher würde ich bevorzut eine Weiche nutzen, die QT von sich aus mitbringt und bisher dachte ich, das wäre Q_MOC_RUN...



  • @firefly: Du meinst, daß @It0101 immer #include <QMetaType> aufrufen muß, auch in einem Projekt ohne Qt?



  • @Th69 sagte in QT Q_MOC_RUN:

    @firefly: Du meinst, daß @It0101 immer #include <QMetaType> aufrufen muß, auch in einem Projekt ohne Qt?

    Das geht halt schon deswegen nicht, weil andere Projekte den Header gar nicht finden.



  • Ich löse das jetzt erstmal temporär in der Form, als dass ich einen zusätzlichen Header mache, der den originalen Header inkludiert und das Q_DECLARE_METATYPE aufruft. An jeder Stelle im Code, in der ich "MyClass" benötige, inkludiere ich dann entsprechen diesen Header.

    #ifndef MYMETATYPES_H
    #define MYMETATYPES_H
    
    #include <QMetaType>
    
    // MyClass: Registrierung fuer SignalSlot
    #include "myclass.h"
    Q_DECLARE_METATYPE( MyClass );
    
    // zum Aufruf in "main.cpp"
    inline void regMetaTypes()
    {
        qRegisterMetaType<MyClass> ();
    }
    
    #endif // MYMETATYPES_H
    

    Keine besonders schöne Lösung, aber sie löst erstmal temporär das Problem.



  • @Th69 sagte in QT Q_MOC_RUN:

    @firefly: Du meinst, daß @It0101 immer #include <QMetaType> aufrufen muß, auch in einem Projekt ohne Qt?

    Nein! sondern der Qt relevante part muss über ein anderes Preprocessor define aktiviert werden.