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
-
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 ? -
@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)
-
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. -
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
-
@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
-
@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