Unable to change bools in C++ struct
-
OK, so I discovered something, but I don't understand it. I stepped through this in the debugger, and confirmed the problem is in the C++ side:
Then, for lack of anything else to try, I removed the initializer in my struct:
// bool m_maintenance = false; // before bool m_maintenance; // now
and...
For another test, I added this line to my c'tor:bool m_maintenance = false;
And got the original (bad) result.
I also "changed polarity" (initialize to true; try to set to false) with the same (bad) result.
So...this problem just got a little bigger. I'm not willing to release code to the field that creates structs with uninitialized values; I need to figure out what's going on here.
EDIT: this occurs on 6.6 as well as 6.5.3.
ANY ideas, no matter how far-fetched, are welcome. Thanks...
-
@JoeCFD interesting article, though my issue is with modification, not initialization.
Regarding the use of structs: I suppose I could use a class, but I'd be astonished if that made a difference. I'm deliberately avoiding using QObject here, too.
-
@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 })
-
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.
-
@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.
-
@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.
-