Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct


    Qt World Summit: Early-Bird Tickets

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

    German
    2
    11
    613
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      Galilio last edited by

      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

      J.Hilk 1 Reply Last reply Reply Quote 0
      • J.Hilk
        J.Hilk Moderators @Galilio last edited by J.Hilk

        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 ?

        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct

        Qt Needs YOUR vote: https://bugreports.qt.io/browse/QTQAINFRA-4121


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        1 Reply Last reply Reply Quote 0
        • G
          Galilio last edited by

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

          J.Hilk 1 Reply Last reply Reply Quote 0
          • J.Hilk
            J.Hilk Moderators @Galilio last edited by

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

            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct

            Qt Needs YOUR vote: https://bugreports.qt.io/browse/QTQAINFRA-4121


            Q: What's that?
            A: It's blue light.
            Q: What does it do?
            A: It turns blue.

            G 2 Replies Last reply Reply Quote 0
            • G
              Galilio last edited by

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

              1 Reply Last reply Reply Quote 0
              • G
                Galilio @J.Hilk last edited by

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

                class CTierStub: public QObject {
                    Q_OBJECT
                
                public:
                
                    enum TierGroup {
                        Adult = 0,
                        Pediatric,
                        Neonatal
                    };Q_ENUM(TierGroup);	
                }
                
                1 Reply Last reply Reply Quote 0
                • G
                  Galilio @J.Hilk last edited by

                  @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

                  J.Hilk 1 Reply Last reply Reply Quote 0
                  • J.Hilk
                    J.Hilk Moderators @Galilio last edited by

                    @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

                    Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct

                    Qt Needs YOUR vote: https://bugreports.qt.io/browse/QTQAINFRA-4121


                    Q: What's that?
                    A: It's blue light.
                    Q: What does it do?
                    A: It turns blue.

                    1 Reply Last reply Reply Quote 0
                    • G
                      Galilio last edited by

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

                      J.Hilk 1 Reply Last reply Reply Quote 0
                      • J.Hilk
                        J.Hilk Moderators @Galilio last edited by J.Hilk

                        @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
                        
                        

                        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct

                        Qt Needs YOUR vote: https://bugreports.qt.io/browse/QTQAINFRA-4121


                        Q: What's that?
                        A: It's blue light.
                        Q: What does it do?
                        A: It turns blue.

                        G 1 Reply Last reply Reply Quote 0
                        • G
                          Galilio @J.Hilk last edited by

                          @J-Hilk
                          danke

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post