[Development] Qt Configuration Generation from Schema
Tomaz Canabrava
tcanabrava at kde.org
Sun Jan 1 10:35:23 CET 2017
Greetings,
A *long* time ago I started trying to create a replacement for QSettings in
json, but if failed for the following reasons:
- Different Views on what it should accomplish - I envisioned the JSON as a
meta-language for generating the C++ code for the QSettings, while others
tougth I was using JSON as the settings definitions on disk
- Json has no notion of int / floating point, everything is floating point,
and so on the json file I had to add an entry for the type of the setting
for every setting, making that option quite verbose.
- Json is not the default configuration file for windows / mac / android /
ios, while usual unix has no default, that's a stopper per see, as some
projects should use the default on each system.
So I tried a different approach this time, creating a qml-like sintax for
the configuration file, a pre-processor that generates C++ code for
QSettings and it's easily used with Widgets / QML code,
It looks a bit like KConfigXT without the extras and written in something
less verbose than XML, and imo my approach also generates a better c++
class chain than KConfigXT (on KConfigXT all the preferences members are
"global" from within the main Preferences class, while on my they are
agreggated in subclasses).
It also provides a signal / slot for each setting, so a change on any
setting will change the QML component that interacts with it:
preferences.conf file:
#include <QColor>
Preferences {
Window {
QColor color = "#FF0000"
}
}
QML usage:
Rectangle {
backgroundColor : preferences.window.color
}
onSomething {
preferences.window.color = "black"
}
C++ usage:
#include "genreated_preferences.h"
Preferences::self()->load();
connect(Preferences::window(), &Window::colorChanged, [=](const QColor& c)
{ setBackgroundColor(c});
Preferences::self()->window()->setColor( QColor("#010101") );
Preference::self()->sync();
the current code works (as in generates the correct c++ classes), there's
plenty of unittests with examples on how to write the configuration files,
and I tested all the compiled files against a simple application to be sure
there are no obvious bugs.
This was my first try at a C++ project that didn't used Qt so if there's
anything wrong there I'll fix, and please don't hit the developer :)
code currently is in https://github.com/tcanabrava/configuration-parser
If this is something that qt has interest on integrating I'll gladly change
everything on the project necessarely for that.
Regards,
Tomaz Canabrava
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20170101/5e40a570/attachment.html>
More information about the Development
mailing list