Простым решением, которое я нашел, является создание подкласса QSettings, добавление Q_INVOKABLE к методам, которые я хочу вызвать из QML. Затем я помещаю экземпляр этого класса в контексте QML.
Вот как это выглядит в коде.
В settings.hpp
:
#ifndef Settings_HPP
#define Settings_HPP
#include <QSettings>
class Settings: public QSettings
{
Q_OBJECT
public:
Settings(QObject *parent = 0);
Q_INVOKABLE QVariant value(const QString& key, const QVariant& defaultValue = QVariant()) const;
Q_INVOKABLE void setValue(const QString& key, const QVariant& value);
};
#endif
В settings.cpp
:
#include "settings.hpp"
Settings::Settings(QObject *parent)
: QSettings(parent)
{
}
QVariant Settings::value(const QString& key, const QVariant& defaultValue) const
{
return QSettings::value(key, defaultValue);
}
void Settings::setValue(const QString& key, const QVariant& value)
{
QSettings::setValue(key, value);
}
И, конечно же, где когда-либо вы создаете экземпляр QmlDocument (applicationui.cpp
в моем случае), вы бы добавить:
#include "settings.hpp"
...
qml->setContextProperty("settings", new Settings());
Из кода QML я могу делать такие вещи, как:
ToggleButton {
checked: settings.value('somekey')
onCheckedChanged: {
settings.setValue('somekey', checked);
}