Can't access all class members in QVariantList from QML

3 weeks ago 22
ARTICLE AD BOX

I have a QML file that I'm trying to read a QVariantList which contains a QObject Configuration::AmbientLoopConfiguration and its properties. I'm able to see the list has the instance of the object I'm creating elsewhere as expected in QML, but the expected properties mName and mFile are not visible(undefined). What am I missing so I can access mFile and mName?

configuration.cpp

#ifndef CONFIGURATION_H #define CONFIGURATION_H #include "qdom.h" #include <QObject> #include <QVariant> class Configuration : public QObject { Q_OBJECT public: Configuration(); /* non zone members */ Q_PROPERTY(QVariantList getAmbientLoopConfigurations READ getAmbientLoopConfigurations CONSTANT) struct AmbientLoopConfiguration { QString mName = "foo"; QString mFile = "bar"; }; struct ShellyConfiguration { QString mID; QString mIP; }; struct CameraConfiguration { QString mName; QString mLowRTSP; QString mMedRTSP; QString mHighRTSP; }; struct PresetConfiguration { QString mName; QString mColorCode; }; struct SceneItemConfiguration { bool mState; QString mDevice; QString mColorCode; }; struct SceneGroupConfiguration { QString mName; QList<QString> mZones; QList<SceneItemConfiguration> mSceneItems; }; /* zone members */ struct LightConfiguration { QString mName; QString mShellyID; }; struct SensorConfiguration { QString mName; QString mID; }; struct ZoneConfiguration { QString mName; QString mColorCode; QList<Configuration::LightConfiguration> mLightConfigurations; QList<Configuration::SensorConfiguration> mSensorConfigurations; }; /* base config object */ struct Config { QList<Configuration::ZoneConfiguration> mZoneConfigurations; QList<Configuration::ShellyConfiguration> mShellyConfigurations; QList<Configuration::CameraConfiguration> mCameraConfigurations; QList<Configuration::PresetConfiguration> mPresetConfigurations; QList<Configuration::SceneGroupConfiguration> mSceneGroupConfigurations; QList<Configuration::AmbientLoopConfiguration> mAmbientLoopConfigurations; }; Q_INVOKABLE Config getConfiguration() { return this->config; }; QVariantList getAmbientLoopConfigurations() { QVariantList l; for (Configuration::AmbientLoopConfiguration &c : this->config.mAmbientLoopConfigurations) { l.append(QVariant::fromValue(c)); } return l; }; Q_INVOKABLE bool loadBaseConfiguration(); Q_INVOKABLE bool loadUserDefinedConfiguration(); private: Config config; QDomDocument validateConfigFile(QString config); }; #endif // CONFIGURATION_H

main.cpp

Configuration *configuration = new Configuration(); configuration->loadBaseConfiguration(); configuration->loadUserDefinedConfiguration(); .. qmlRegisterType<Configuration>("smah.configuration", 1, 0, "Configuration"); qmlRegisterType<Configuration::AmbientLoopConfiguration>("smah.configuration.ambient", 1, 0, "ConfigurationAmbient"); .. engine.rootContext()->setContextProperty("configuration", configuration);

Media.qml

import QtQuick 2.0 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.13 import QtMultimedia import smah.configuration import smah.configuration.ambient import "." import "qrc:/SMAHComponents" Page { id: page x: 0 Component.onCompleted: { console.log(configuration.getAmbientLoopConfigurations[0]) console.log(configuration.getAmbientLoopConfigurations[0].mName) } }

The above code outputs

QVariant(Configuration::AmbientLoopConfiguration, ) undefined
Read Entire Article