Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Wie kann ich getter und setter für einen Q_ENUM benutzen?



  • Ich habe folgende:

    class CTierStub: public QObject {
        Q_OBJECT
        Q_PROPERTY(QString tierGroup READ getTierGroup WRITE setTierGroup NOTIFY tierGroupChanged)
        Q_PROPERTY(QString gender READ getGender WRITE setGender NOTIFY genderChanged)
    
    signals:
        void TierGroupChanged(QString strTierGroup);
        void genderChanged(QString strGender);
    
    public:
    //getter und setter ?
    
    private:
        enum TierGroup {
            Adult = 0,
            Pediatric,
            Neonatal
        };Q_ENUM(TierGroup);
    	
        enum Gender {
            Male,
            Female
        } ; Q_ENUM(Gender);
        
    };
    

    Danke


  • Moderators

    Guten Morgen @Galilio

    ich fürchte du musst etwas weiter ausholen.

    Was genau willst du machen, weil deine Properties erwarten ein QString als Typen und nen enum ist im Prinzip ein int.

    Zudem ist die Enum-Deklaration im Privaten Teil deiner Klasse also von außen nicht sichtbar.

    Was willst du machen?
    Die Enums in QML verwenden, oder vielleicht einen Enumwert in lesbaren String umwandeln ?



  • @J-Hilk
    ich will gerne die Enums in QML verwenden und diese in einem lesbaren String umwandeln


  • Moderators

    @Galilio Tja,

    wir haben (noch) keine richtige Reflection in C++, normalerweise behilft man sich da mit einer function -> Enum zu String

    Da du Qt nutzt kannst du aber auf Qt's MetaEnum system zurückgreifen z.b:

     enum AppleType {
       Big,
      Small
    };
    Q_ENUM(AppleType)
    
    ...
    
    QMetaEnum mE = QMetaEnum::fromType<Klasse::AppleType>();
    qDebug() << mE.valueToKey(Klasse::Big);
    

    Das Meta Enum System erlaubt es dir auch C++ Enums direkt in QML zu benutzen, dazu musst du dein Enum auch mit dem Q_ENUM macro versehen und es registrieren via

    qmlRegisterUncreatableType<Klasse>("EnumsImportName", 1,0, "EnumPrefix", "Enums are not a type");
    

    dann kannst du es in QML importieren und nutzen:

    import EnumsImportName 1.0
    
    ....
    
    console.log(EnumPrefix.Big)
    


  • @J-Hilk

    danke für die Antwort
    Auf die QML Seite ist eigentlich alles gemacht was Registrierung (qmlRegisterUncreatableType) betrifft.
    Hier geht es eigentlich um einen Unittest für diese zu schreiben deswegen ist die Klasse so genannt worden " CTierStub". Diese ist nicht anders als Dummy Object, damit die Enums
    setzen und prüfen kann.



  • @J-Hilk
    wird dann mein class so aussehen?:

    class CTierStub: public QObject {
        Q_OBJECT
    
    public:
    
        enum TierGroup {
            Adult = 0,
            Pediatric,
            Neonatal
        };Q_ENUM(TierGroup);	
    }
    


  • @J-Hilk

    Hi @J-Hilk
    Was ist dann falsch an diese Schreibweise?

    class CGuiTierInfoStub: public QObject {
        Q_OBJECT
        Q_PROPERTY(TTierGroup TierGroup READ getTierGroup WRITE setTierGroup NOTIFY TierGroupChanged)
        Q_PROPERTY(TGender gender READ getGender WRITE setGender NOTIFY genderChanged)
    
    signals:
        void TierGroupChanged(TTierGroup enumTierGroup);
        void genderChanged(TGender enumGender);
    
    public:
        TTierGroup getTierGroup() const { return mTierGroup; }
        void setTierGroup(const TTierGroup& enumValue) {
            if(mTierGroup != enumValue) {
                mTierGroup = enumValue;
                emit TierGroupChanged(mTierGroup);
            }
        }
    
        TGender getGender() const { return mGender; }
        void setGender(const TGender& enumValue) {
            if(mGender != enumValue) {
                mGender = enumValue;
                emit genderChanged(mGender);
            }
        }
    
        enum TTierGroup {
            Adult = 0,
            Pediatric,
            Neonatal
        };Q_ENUM(TTierGroup);
    
        enum TGender {
            Male,
            Female
        } ; Q_ENUM(TGender);
    
    private:
        TTierGroup mTierGroup;
        TGender mGender;
    };
    Q_DECLARE_METATYPE(CGuiTierInfoStub::TTierGroup)
    Q_DECLARE_METATYPE(CGuiTierInfoStub::TGender)
    

    Danke


  • Moderators

    @Galilio Sieht soweit ok aus

    Ich sehe Q_DECLARE_METATYPE, hast du es auch registered, weil es soll ja hier teil des Property Systems sein
    Dokumentation:

    Note that if you intend to use the type in queued signal and slot connections or in QObject's property system, you also have to call qRegisterMetaType() since the names are resolved at runtime.
    

    Und, dann achte drauf, das du immer mit dem vollem Namespace arbeitest den du für die Registrierung verwendet hast



  • @J-Hilk
    mit der getter und setter bekomme ich die Meldung, dass "unknow type name TPatientGroup bzw TGender "


  • Moderators

    @Galilio enum Definierung nach Obe, idealerweise vor den Constructor ( den du noch hinzufügen solltest um QObject richtig zu initialisieren!)

    #ifndef CGUITIERINFOSTUB_H
    #define CGUITIERINFOSTUB_H
    
    #include <QObject>
    
    class CGuiTierInfoStub: public QObject {
        Q_OBJECT
        Q_PROPERTY(TTierGroup TierGroup READ getTierGroup WRITE setTierGroup NOTIFY TierGroupChanged)
        Q_PROPERTY(TGender gender READ getGender WRITE setGender NOTIFY genderChanged)
    
    public:
        enum TTierGroup {
            Adult = 0,
            Pediatric,
            Neonatal
        };Q_ENUM(TTierGroup);
    
        enum TGender {
            Male,
            Female
        } ; Q_ENUM(TGender);
        
    signals:
        void TierGroupChanged(TTierGroup enumTierGroup);
        void genderChanged(TGender enumGender);
    
    public:
        explicit CGuiTierInfoStub(QObject *parent = nullptr) : QObject(parent){}
        TTierGroup getTierGroup() const { return mTierGroup; }
        void setTierGroup(const TTierGroup& enumValue) {
            if(mTierGroup != enumValue) {
                mTierGroup = enumValue;
                emit TierGroupChanged(mTierGroup);
            }
        }
    
        TGender getGender() const { return mGender; }
        void setGender(const TGender& enumValue) {
            if(mGender != enumValue) {
                mGender = enumValue;
                emit genderChanged(mGender);
            }
        }
    
    
    private:
        TTierGroup mTierGroup;
        TGender mGender;
    };
    Q_DECLARE_METATYPE(CGuiTierInfoStub::TTierGroup)
    Q_DECLARE_METATYPE(CGuiTierInfoStub::TGender)
    
    #endif // CGUITIERINFOSTUB_H
    
    


  • @J-Hilk
    danke


Log in to reply