Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Unable to change bools in C++ struct
Forum Updated to NodeBB v4.3 + New Features

Unable to change bools in C++ struct

Scheduled Pinned Locked Moved Solved QML and Qt Quick
25 Posts 5 Posters 3.3k 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.
  • JoeCFDJ JoeCFD

    @mzimmers bool m_maintenance; // now
    is undefined.

    can you try:
    bool m_maintenance{ false };
    I do not know if it will make a difference.

    mzimmersM Offline
    mzimmersM Offline
    mzimmers
    wrote on last edited by
    #16

    @JoeCFD said in Unable to change bools in C++ struct:

    @mzimmers bool m_maintenance; // now
    is undefined.

    I realize that, and that's not acceptable. But currently I have the options of leaving it undefined, or initializing it and (somehow) making it QML-immutable in the process.

    I can't even modify it if I initialize it in QML, like this:

        property schedule newSchedule: ({ "maintenance": false })
    
    1 Reply Last reply
    0
    • JoeCFDJ JoeCFD

      @mzimmers bool m_maintenance; // now
      is undefined.

      can you try:
      bool m_maintenance{ false };
      I do not know if it will make a difference.

      mzimmersM Offline
      mzimmersM Offline
      mzimmers
      wrote on last edited by
      #17

      @JoeCFD said in Unable to change bools in C++ struct:

      can you try:
      bool m_maintenance{ false };

      Same (bad) result. Thanks for the suggestion, though.

      JoeCFDJ 1 Reply Last reply
      0
      • mzimmersM mzimmers

        @JoeCFD said in Unable to change bools in C++ struct:

        can you try:
        bool m_maintenance{ false };

        Same (bad) result. Thanks for the suggestion, though.

        JoeCFDJ Offline
        JoeCFDJ Offline
        JoeCFD
        wrote on last edited by
        #18

        @mzimmers
        try
        class Schedule

        not struct Schedule
        .

        mzimmersM GrecKoG 2 Replies Last reply
        0
        • JoeCFDJ JoeCFD

          @mzimmers
          try
          class Schedule

          not struct Schedule
          .

          mzimmersM Offline
          mzimmersM Offline
          mzimmers
          wrote on last edited by
          #19

          @JoeCFD no change in behavior.

          1 Reply Last reply
          0
          • JoeCFDJ JoeCFD

            @mzimmers
            try
            class Schedule

            not struct Schedule
            .

            GrecKoG Offline
            GrecKoG Offline
            GrecKo
            Qt Champions 2018
            wrote on last edited by
            #20

            @JoeCFD struct is just a class where everything is public by default.

            1 Reply Last reply
            1
            • mzimmersM mzimmers

              @GrecKo this:

                  Component.onCompleted: {
                      var tempSchedule = newSchedule
                      console.log("ScheduleScreen.qml: newSchedule is " + newSchedule)
                      tempSchedule.name = "xxx"
                      tempSchedule.m_maintenance = true
                      tempSchedule.timeOffset = 55
                      tempSchedule.timeFrame = ScheduleEnums.TIMEFRAME_DAILY;
                      newSchedule = tempSchedule
                      console.log("ScheduleScreen.qml: tempSchedule is " + tempSchedule)
                      console.log("ScheduleScreen.qml: newSchedule is " + newSchedule)
                  }
              

              Produces this:

              qml: ScheduleScreen.qml: newSchedule is Schedule({00000000-0000-0000-0000-000000000000}, , {00000000-0000-0000-0000-000000000000}, false, false, , START_ACTION_TURN_ON, END_ACTION_TURN_OFF, START_WHEN_TIME_OF_DAY, END_WHEN_TIME_OF_DAY, 09:00:00.000, 17:00:00.000, TIMEFRAME_WEEKLY, REPEAT_EVERY_WEEK, , , , 0, )
              qml: ScheduleScreen.qml: tempSchedule is Schedule({00000000-0000-0000-0000-000000000000}, xxx, {00000000-0000-0000-0000-000000000000}, false, false, , START_ACTION_TURN_ON, END_ACTION_TURN_OFF, START_WHEN_TIME_OF_DAY, END_WHEN_TIME_OF_DAY, 09:00:00.000, 17:00:00.000, TIMEFRAME_DAILY, REPEAT_EVERY_WEEK, , , , 55, )
              qml: ScheduleScreen.qml: newSchedule is Schedule({00000000-0000-0000-0000-000000000000}, xxx, {00000000-0000-0000-0000-000000000000}, false, false, , START_ACTION_TURN_ON, END_ACTION_TURN_OFF, START_WHEN_TIME_OF_DAY, END_WHEN_TIME_OF_DAY, 09:00:00.000, 17:00:00.000, TIMEFRAME_DAILY, REPEAT_EVERY_WEEK, , , , 55, )
              

              So...no change. Really odd, isn't it?

              GrecKoG Offline
              GrecKoG Offline
              GrecKo
              Qt Champions 2018
              wrote on last edited by
              #21

              @mzimmers what's the issue on this output? We don't know which field is which. Also why are you using m_maintenance in QML? That's not the name of your property.

              mzimmersM 1 Reply Last reply
              0
              • GrecKoG GrecKo

                @mzimmers what's the issue on this output? We don't know which field is which. Also why are you using m_maintenance in QML? That's not the name of your property.

                mzimmersM Offline
                mzimmersM Offline
                mzimmers
                wrote on last edited by
                #22

                @GrecKo I don't know how that got in there, but that wasn't how it was originally, and it's not how it is now. My screenshots above are correct.

                1 Reply Last reply
                0
                • mzimmersM Offline
                  mzimmersM Offline
                  mzimmers
                  wrote on last edited by
                  #23

                  OK, guys - here's a minimal repeatable example:

                  // schedule.h
                  #pragma once
                  
                  #include <QObject>
                  #include <QMetaType>
                  #include <QtQml/qqmlregistration.h>
                  #include <QtQmlIntegration/QtQmlIntegration>
                  
                  struct Schedule
                  {
                      Q_GADGET
                      QML_VALUE_TYPE(schedule)
                      QML_STRUCTURED_VALUE
                      Q_PROPERTY(bool maintenance MEMBER m_maintenance)
                  public:
                      bool m_maintenance;
                      Q_INVOKABLE Schedule() {}
                      bool operator ==(const Schedule &rhs) const {return true;}
                  };
                  
                  // Main.qml
                  import QtQuick
                  import QtQuick.Controls
                  import QtQuick.Layouts
                  import QtQuick.Window
                  
                  Window {
                      id: mainWindow
                      width: 640
                      height: 480
                      visible: true
                  
                      property schedule newSchedule: ({  })
                  
                      Switch {
                          onClicked: {
                              console.log("switch is " + checked)
                              newSchedule.maintenance = checked
                              console.log("newSchedule.maintenance is " + newSchedule.maintenance)
                          }
                      }
                  }
                  

                  Output:

                  qml: switch is true
                  qml: newSchedule.maintenance is false
                  qml: switch is false
                  qml: newSchedule.maintenance is false
                  qml: switch is true
                  qml: newSchedule.maintenance is false
                  qml: switch is false
                  qml: newSchedule.maintenance is false
                  

                  I can provide the cmake file as well if desired, but it doesn't contain anything unusual.

                  GrecKoG 1 Reply Last reply
                  0
                  • mzimmersM mzimmers

                    OK, guys - here's a minimal repeatable example:

                    // schedule.h
                    #pragma once
                    
                    #include <QObject>
                    #include <QMetaType>
                    #include <QtQml/qqmlregistration.h>
                    #include <QtQmlIntegration/QtQmlIntegration>
                    
                    struct Schedule
                    {
                        Q_GADGET
                        QML_VALUE_TYPE(schedule)
                        QML_STRUCTURED_VALUE
                        Q_PROPERTY(bool maintenance MEMBER m_maintenance)
                    public:
                        bool m_maintenance;
                        Q_INVOKABLE Schedule() {}
                        bool operator ==(const Schedule &rhs) const {return true;}
                    };
                    
                    // Main.qml
                    import QtQuick
                    import QtQuick.Controls
                    import QtQuick.Layouts
                    import QtQuick.Window
                    
                    Window {
                        id: mainWindow
                        width: 640
                        height: 480
                        visible: true
                    
                        property schedule newSchedule: ({  })
                    
                        Switch {
                            onClicked: {
                                console.log("switch is " + checked)
                                newSchedule.maintenance = checked
                                console.log("newSchedule.maintenance is " + newSchedule.maintenance)
                            }
                        }
                    }
                    

                    Output:

                    qml: switch is true
                    qml: newSchedule.maintenance is false
                    qml: switch is false
                    qml: newSchedule.maintenance is false
                    qml: switch is true
                    qml: newSchedule.maintenance is false
                    qml: switch is false
                    qml: newSchedule.maintenance is false
                    

                    I can provide the cmake file as well if desired, but it doesn't contain anything unusual.

                    GrecKoG Offline
                    GrecKoG Offline
                    GrecKo
                    Qt Champions 2018
                    wrote on last edited by GrecKo
                    #24

                    @mzimmers said in Unable to change bools in C++ struct:

                    bool operator ==(const Schedule &rhs) const {return true;}

                    If you remove this non-sensical operator== your code works as expected.

                    My guess is that the engine modifies a temp Schedule internally, checks the equality and assign it only if it's different. As it's always equal it won't modify it.

                    mzimmersM 1 Reply Last reply
                    4
                    • GrecKoG GrecKo

                      @mzimmers said in Unable to change bools in C++ struct:

                      bool operator ==(const Schedule &rhs) const {return true;}

                      If you remove this non-sensical operator== your code works as expected.

                      My guess is that the engine modifies a temp Schedule internally, checks the equality and assign it only if it's different. As it's always equal it won't modify it.

                      mzimmersM Offline
                      mzimmersM Offline
                      mzimmers
                      wrote on last edited by
                      #25

                      @GrecKo bingo!

                      I'd just stubbed out that comparison function to satisfy the compiler, but you were absolutely right. In my app, I'd neglected to include the maintenance member in my comparison function. Seems to work fine now.

                      Kind of has me wondering -- if I set my compiler options to no optimization, I wonder if it would have worked...

                      Anyway, thanks to EVERYONE for the help on this.

                      1 Reply Last reply
                      0
                      • mzimmersM mzimmers has marked this topic as solved on

                      • Login

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