Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Nested class in Qt5
Forum Updated to NodeBB v4.3 + New Features

Nested class in Qt5

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
26 Posts 5 Posters 4.7k Views 3 Watching
  • 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.
  • J Juancinho_cardecan
    20 Mar 2020, 10:38

    @mrjj Hi

    I've been tried to implement your recommendation and also with setters/getters but at time that I want to pass the brightValue from the function void brightness::brightnessText(const QString &in) into the function void rgbLed::rgbRecive(const QString &in) unfortunately the variable b takes a random value inside the method rgbRecive:

    This is the following code:

    class rgbLed;
    
    class brightness : public QObject
    {
        Q_OBJECT
    public:
        explicit brightness(QObject *parent = 0);
        friend rgbLed;
        void setBrightValue(int newbrightValueMember)
        {
            brightValueMember = newbrightValueMember;
        };
        int getBrightValue()
        {
            return brightValueMember;
        }
    
        bool flag = 0;
        int brightValueMember;
    
    public slots:
        void brightnessText(const QString& in);
    };
    
    class rgbLed : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged)
    public:
        explicit rgbLed(QObject *parent = nullptr);
        brightness obj;
        int regresion_red(int red);
        int regresion_green(int green);
        int regresion_blue(int blue);
    
        Q_INVOKABLE int bright();
        Q_INVOKABLE int setBright(int x);
        Q_INVOKABLE void add(rgbLed *x);
    
    
        int r;
        int g;
        int b;
        int r2;
        int g2;
        int b2;
        int brightValue;
        int myBrightness;
        QStringList list;
        QString my_in;
    
        int red = 0;
        int green = 0;
        int blue = 0;
        int pos = 0 ;
        bool flag = 0;
        int x;
    
    signals:
        void brightChanged(int x);
    
    public slots:
        void rgbRecive(const QString &in);
    };
    
    

    and in my .cpp:

    void brightness::brightnessText(const QString &in)
    {
    
        QString Bright = in;
        int brightValue;
        brightValue = Bright.toInt(&flag);
        setBrightValue(brightValue);
    
        qDebug() << "bright: " << brightValue;
    }
    
    void rgbLed::rgbRecive(const QString &in)
    {
        qDebug() << "ColorPicked:" << in;
    
        QStringList listNew = in.split(",");
        QStringList a_list = listNew[0].split("(");
        QStringList b_list = listNew[2].split(")");
    
        int b = obj.getBrightValue();
        qDebug() << "Value: " << b;
    }
    

    Could anyone see why b is taken a random value?

    J Online
    J Online
    jsulm
    Lifetime Qt Champion
    wrote on 20 Mar 2020, 11:43 last edited by jsulm
    #14

    @Juancinho_cardecan Where do you call brightness::brightnessText?
    Do you call it on rgbLed::obj or maybe on another brightness instance?

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    J 1 Reply Last reply 20 Mar 2020, 12:04
    1
    • J jsulm
      20 Mar 2020, 11:43

      @Juancinho_cardecan Where do you call brightness::brightnessText?
      Do you call it on rgbLed::obj or maybe on another brightness instance?

      J Offline
      J Offline
      Juancinho_cardecan
      wrote on 20 Mar 2020, 12:04 last edited by
      #15

      @jsulm I called here after your words but the value doesn't change:

      void rgbLed::rgbRecive(const QString &in)
      {
      qDebug() << "ColorPicked:" << in;

      QStringList listNew = in.split(",");
      QStringList a_list = listNew[0].split("(");
      QStringList b_list = listNew[2].split(")");
      
      obj.brightnessText(in);
      int b = obj.getBrightValue();
      qDebug() << "Value: " << b;
      

      }

      J 1 Reply Last reply 20 Mar 2020, 12:08
      0
      • J Juancinho_cardecan
        20 Mar 2020, 12:04

        @jsulm I called here after your words but the value doesn't change:

        void rgbLed::rgbRecive(const QString &in)
        {
        qDebug() << "ColorPicked:" << in;

        QStringList listNew = in.split(",");
        QStringList a_list = listNew[0].split("(");
        QStringList b_list = listNew[2].split(")");
        
        obj.brightnessText(in);
        int b = obj.getBrightValue();
        qDebug() << "Value: " << b;
        

        }

        J Online
        J Online
        jsulm
        Lifetime Qt Champion
        wrote on 20 Mar 2020, 12:08 last edited by
        #16

        @Juancinho_cardecan Called where? And did you call it on rgbLed::obj?

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        J 2 Replies Last reply 20 Mar 2020, 12:17
        2
        • J jsulm
          20 Mar 2020, 12:08

          @Juancinho_cardecan Called where? And did you call it on rgbLed::obj?

          J Offline
          J Offline
          Juancinho_cardecan
          wrote on 20 Mar 2020, 12:17 last edited by
          #17
          This post is deleted!
          1 Reply Last reply
          0
          • J jsulm
            20 Mar 2020, 12:08

            @Juancinho_cardecan Called where? And did you call it on rgbLed::obj?

            J Offline
            J Offline
            Juancinho_cardecan
            wrote on 20 Mar 2020, 12:30 last edited by
            #18

            @jsulm No I din't call it on rgbLed::obj, I called it inside the function void rgbLed::rgbRecive

            1 Reply Last reply
            0
            • M Offline
              M Offline
              mrjj
              Lifetime Qt Champion
              wrote on 20 Mar 2020, 13:00 last edited by
              #19

              Hi
              So here

              void rgbLed::rgbRecive(const QString &in)
              {
              obj.brightnessText(in);
              int b = obj.getBrightValue();
              

              b is not what you expect ?

              J 1 Reply Last reply 20 Mar 2020, 13:08
              1
              • M mrjj
                20 Mar 2020, 13:00

                Hi
                So here

                void rgbLed::rgbRecive(const QString &in)
                {
                obj.brightnessText(in);
                int b = obj.getBrightValue();
                

                b is not what you expect ?

                J Offline
                J Offline
                Juancinho_cardecan
                wrote on 20 Mar 2020, 13:08 last edited by
                #20

                @mrjj yes it's not what I'm expecting, it might be changing all the time but the value is zero always.

                M 1 Reply Last reply 20 Mar 2020, 13:11
                0
                • J Juancinho_cardecan
                  20 Mar 2020, 13:08

                  @mrjj yes it's not what I'm expecting, it might be changing all the time but the value is zero always.

                  M Offline
                  M Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on 20 Mar 2020, 13:11 last edited by mrjj
                  #21

                  @Juancinho_cardecan
                  I would check

                  brightValue = Bright.toInt(&flag);
                  (in void brightness::brightnessText(const QString &in))
                  and see if flag is false as that mean text to Int failed.

                  J 1 Reply Last reply 23 Mar 2020, 16:34
                  1
                  • M mrjj
                    20 Mar 2020, 13:11

                    @Juancinho_cardecan
                    I would check

                    brightValue = Bright.toInt(&flag);
                    (in void brightness::brightnessText(const QString &in))
                    and see if flag is false as that mean text to Int failed.

                    J Offline
                    J Offline
                    Juancinho_cardecan
                    wrote on 23 Mar 2020, 16:34 last edited by
                    #22

                    @mrjj the flag is true and the value of brightValue is passing correctly, then the text to Int didn't failed, i dont know what is happening because if the values from QML are passing correctly, I'm calling in the wrong way the function brightnessText inside:

                    cpp file:

                    void rgbLed::rgbRecive(const QString &in)
                    {
                         my_brightness.brightnessText(in);
                        int b = my_brightness.getBrightValue();
                        qDebug() << "Value: " << b;
                    }
                    
                    void brightness::brightnessText(const QString &in)
                    {
                        QString Bright = in;
                        int brightValue;
                        brightValue = Bright.toInt(&flag);
                        qDebug() << "brightValue: " << brightValue;
                        qDebug() << "flag: " << flag;
                        setBrightValue(brightValue);
                    
                        qDebug() << "bright: " << brightValue;
                    }
                    
                    
                    
                    

                    main.cpp:

                    int main(int argc, char *argv[])
                    {
                    
                        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
                        QGuiApplication app(argc, argv);
                       
                    
                        QQmlApplicationEngine engine;
                        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
                        if (engine.rootObjects().isEmpty())
                                return -1;
                    
                        //Root Object to find Items in QML
                        QObject* root = engine.rootObjects()[0];
                        assert(root != nullptr);
                    
                        // The QML Item to which we want to inject our QML-Item-loaded-from-file
                        QQuickItem* colorSelector = qobject_cast<QQuickItem*>(root->findChild<QObject*>("colorSelector"));
                        assert(colorSelector != nullptr);
                    
                    
                        // Load the QML file to a component
                        QString qml_path = "ColorSelector.qml";
                        QQmlComponent comp(&engine, QUrl::fromLocalFile(qml_path));
                    
                        QScopedPointer<rgbLed> slider (new rgbLed);
                        engine.rootContext()->setContextProperty("slider", slider.data());
                        QObject *topLevel = engine.rootObjects().value(0);
                        QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
                    
                        // Create an instance of the component
                        rgbLed my_rgbLed;//Creation an Object instance
                        brightness my_brightness;
                    
                        //Code to conecct a signal with the slot
                        QObject::connect(colorSelector, SIGNAL(colorChanged(QString)), &my_rgbLed, SLOT(rgbRecive(QString)));
                    
                        // connect our QML signal to our C++ slot
                          QObject::connect(window, SIGNAL(submitTextField(QString)), &my_brightness, SLOT(brightnessText(QString)));
                    
                        return app.exec();
                    }
                    
                    
                    

                    header file:

                    class rgbLed;
                    
                    class brightness : public QObject
                    {
                        Q_OBJECT
                    public:
                        explicit brightness(QObject *parent = 0);
                        friend rgbLed;
                        void setBrightValue(int newbrightValueMember)
                        {
                            brightValueMember = newbrightValueMember;
                        };
                        int getBrightValue()
                        {
                            return brightValueMember;
                        }
                    
                        bool flag = 0;
                        int brightValueMember;
                    
                    public slots:
                        void brightnessText(const QString& in);
                    };
                    
                    
                    class rgbLed : public QObject
                    {
                        Q_OBJECT
                        Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged)
                    public:
                        explicit rgbLed(QObject *parent = nullptr);
                        brightness my_brightness;
                        int regresion_red(int red);
                        int regresion_green(int green);
                        int regresion_blue(int blue);
                    
                        Q_INVOKABLE int bright();
                        Q_INVOKABLE int setBright(int x);
                        Q_INVOKABLE void add(rgbLed *x);
                    
                    
                        int r;
                        int g;
                        int b;
                        int r2;
                        int g2;
                        int b2;
                        int brightValue;
                        int myBrightness;
                        QStringList list;
                        QString my_in;
                    
                        int red = 0;
                        int green = 0;
                        int blue = 0;
                        int pos = 0 ;
                        bool flag = 0;
                        int x;
                    
                    signals:
                        void brightChanged(int x);
                    
                    public slots:
                        void rgbRecive(const QString &in);
                    }
                    
                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on 23 Mar 2020, 17:50 last edited by mrjj
                      #23

                      Hi
                      I think you have 2 instances of brightness called my_brightness

                      void rgbLed::rgbRecive(const QString &in)
                      {
                      my_brightness.brightnessText(in); <<< is the SAME my_brightness as you have in main.cpp?
                      int b = my_brightness.getBrightValue();
                      qDebug() << "Value: " << b;
                      }

                      so
                      rgbLed my_rgbLed;//Creation an Object instance
                      brightness my_brightness;

                      how does the my_brightness from outside come into

                      void rgbLed::rgbRecive(const QString &in) ?
                      It seems it has its own ?
                      So one is being updated but other is not ?

                      In the original code, it was called

                      class rgbLed : public QObject
                      {
                          Q_OBJECT
                          Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged)
                      public:
                          explicit rgbLed(QObject *parent = nullptr);
                          brightness obj; <<< the old internal name of the instance
                      

                      So it works from QML
                      as you do
                      // connect our QML signal to our C++ slot
                      QObject::connect(window, SIGNAL(submitTextField(QString)), &my_brightness, SLOT(brightnessText(QString)));

                      and that changes the one in Mian.cpp
                      but the rgbLed my_rgbLed; and its "obj" is not.

                      I assume you want the brigness instance inside my_rgbLed to change ?

                      J 1 Reply Last reply 24 Mar 2020, 06:10
                      3
                      • M mrjj
                        23 Mar 2020, 17:50

                        Hi
                        I think you have 2 instances of brightness called my_brightness

                        void rgbLed::rgbRecive(const QString &in)
                        {
                        my_brightness.brightnessText(in); <<< is the SAME my_brightness as you have in main.cpp?
                        int b = my_brightness.getBrightValue();
                        qDebug() << "Value: " << b;
                        }

                        so
                        rgbLed my_rgbLed;//Creation an Object instance
                        brightness my_brightness;

                        how does the my_brightness from outside come into

                        void rgbLed::rgbRecive(const QString &in) ?
                        It seems it has its own ?
                        So one is being updated but other is not ?

                        In the original code, it was called

                        class rgbLed : public QObject
                        {
                            Q_OBJECT
                            Q_PROPERTY(int bright READ brigfht WRITE setBright NOTIFY brightChanged)
                        public:
                            explicit rgbLed(QObject *parent = nullptr);
                            brightness obj; <<< the old internal name of the instance
                        

                        So it works from QML
                        as you do
                        // connect our QML signal to our C++ slot
                        QObject::connect(window, SIGNAL(submitTextField(QString)), &my_brightness, SLOT(brightnessText(QString)));

                        and that changes the one in Mian.cpp
                        but the rgbLed my_rgbLed; and its "obj" is not.

                        I assume you want the brigness instance inside my_rgbLed to change ?

                        J Online
                        J Online
                        jsulm
                        Lifetime Qt Champion
                        wrote on 24 Mar 2020, 06:10 last edited by
                        #24

                        @mrjj said in Nested class in Qt5:

                        I think you have 2 instances of brightness called my_brightness

                        I already tryied to explain that...

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        3
                        • J Offline
                          J Offline
                          JonB
                          wrote on 24 Mar 2020, 10:35 last edited by
                          #25

                          @Juancinho_cardecan
                          Assuming @jsulm & @mrjj are correct, each time you create a brightness object anywhere why don't you set its https://doc.qt.io/qt-5/qobject.html#objectName-prop (setObjectName()) to a unique string, then you can see whether one instance is different from another. Printing out &brightnessObjectInstance may also tell you the same, I think.

                          1 Reply Last reply
                          2
                          • M Offline
                            M Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on 25 Mar 2020, 07:11 last edited by mrjj
                            #26

                            Hi

                            Could you try to add

                            brightness & rgbLed: :getBrightness() {
                            return obj; // or what you called it
                            }

                            to
                            class rgbLed : public QObject

                            then in main.cpp

                            QObject::connect(window, SIGNAL(submitTextField(QString)), my_rgbLed.getBrightness(), SLOT(brightnessText(QString)));

                            and remove all
                            brightness my_brightness;
                            as we dont want to use brightness alone ever, only via rgbLed.

                            1 Reply Last reply
                            0

                            23/26

                            23 Mar 2020, 17:50

                            • Login

                            • Login or register to search.
                            23 out of 26
                            • First post
                              23/26
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved