Unable to change bools in C++ struct
-
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.
-