[SOLVED] Read/write user settings



  • I need to save and read user settings for my QML application What would be the best way to do so? Some text/xml file? Is it possible to create/read/write text files from QML?



  • I usually expose a QSettings object from C++.



  • Thanks. So the scenario is to implement a method in main.cpp for reading / writing settings, and call it from QML side?



  • More or less. I use a thin wrapper around QSettings and expose it through a context property.
    @
    // settings.h

    class Settings : public QSettings
    {
    Q_OBJECT

    public:
    explicit Settings(QObject *parent = 0) : QSettings(QSettings::IniFormat,
    QSettings::UserScope,
    QCoreApplication::instance()->organizationName(),
    QCoreApplication::instance()->applicationName(),
    parent) {}

    Q_INVOKABLE inline void setValue(const QString &key, const QVariant &value) { QSettings::setValue(key, value); }
    Q_INVOKABLE inline QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const { return QSettings::value(key, defaultValue); }
    

    };

    Q_DECLARE_METATYPE(Settings*)

    // main.cpp

    QScopedPointer<QApplication> application(new QApplication(argc, argv));
    Settings* settings = new Settings(application.data());

    QScopedPointer<QDeclarativeView> mainWindow(new QDeclarativeView);
    mainWindow->rootContext()->setContextProperty("Settings", settings);

    // MainWindow.qml

    Rectangle {
    id: sidebarContent
    width: Settings.value("desktop/MainWindow.sidebar.width", 200);
    ...
    onReleased: {
    Settings.setValue("desktop/MainWindow.sidebar.width", sidebarContent.width);
    }
    }

    @



  • Getting some troubles. Can you spot what is wrong here? I'm getting error: invalid use of incomplete type 'struct QDeclarativeContext' on line 12:

    main.cpp
    @#include <QtGui/QApplication>
    #include "qmlapplicationviewer.h"
    #include "settings.h"

    Q_DECL_EXPORT int main(int argc, char *argv[])
    {
    QScopedPointer<QApplication> app(createApplication(argc, argv));
    QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());

    // Attaching QSettings wrapper and exposing it to our QML UI
    Settings* settings = new Settings(app.data());
    viewer->rootContext()->setContextProperty("Settings", settings);
    
    viewer->setMainQmlFile&#40;QLatin1String("qml/myApp/main.qml"&#41;&#41;;
    viewer->showExpanded();
    
    return app->exec&#40;&#41;;
    

    }@

    The only difference here with your code is that currently wizard generated code contains QmlApplicationViewer instance instead of QDeclarativeView (like in your code).



  • You haven't included <QtGui/QDeclarativeContext>.



  • Thanks a lot, works now!



  • You're welcome. If the problem has been solved for you feel free to edit your initial post title and prepend "[Solved]" to it to indicate that there is a solution inside.



  • Hey, is there some way to save image to settings? I have path to the image, how do I save it now to Settings?



  • Try this :
    @settings.setValue("General/Pixmap", pixmap ); // pxmap is QPixmap@

    I haven't tried it yet, let me knw whats happening :)



  • Thanks. How do I construct QPixmap in QML?





  • I'm still sort of confused. Is it possible to construct QPixmap in QML layer, or do I have to do something on C++ side as well?



  • A request from QML for image/pixmap is handled by the 'Image Provider ' class, in simple words.

    Yes you have to implement the Image provider in C++.



  • Ok, thanks, I'll try to play with this idea.



  • Thank you for this excellent post!!
    Cheers,
    Jon



  • Is the wrapper suppose to work out of the box and how do i make it work without qscopedpointer? Thank you

    EDIT : Created a proper solution so anyone can answer to help future member


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.