Всем доброго времени.
Делаю обертку над QSettings. Хочу чтобы имя ключа в реестре соответствовало имени проперти.
Т.е. чтобы при работе с реестром автоматом подставлялся ключ с именем проперти.:
C++ (Qt)
class Foo: public QObject
{
Q_OBJECT
Q_PROPERTY(bool foo READ foo WRITE setFoo)
public:
explicit MySettings(QObject *parent = 0)
: QObject(parent)
{
}
void setFoo(bool set)
{
QSettings settings;
settings.setValue("foo", set); // здесь хочу чтобы ключ "foo" брался автоматом из имени проперти "foo"
}
bool foo() const
{
QSettings settings;
return settings.value("foo").toBool(); // здесь хочу чтобы ключ "foo" брался автоматом из имени проперти "foo"
}
}
Почитал про мета-объектную систему, но что-то не соображу, как получить взаимосвязь между именами геттера foo(), сететра setFoo() и свойства foo.
Нужно накатать некий метод, который бы автоматом позвращал имя проперти из сеттера/геттера, как-то так:
C++ (Qt)
QString propertyName(const QString methodName)
{
QString propName;
// тут надо что-то делать
return propName;
}
void Foo::setFoo(bool set)
{
QSettings settings;
settings.setValue(propertyName(__FUNCTION__), set);
}
bool foo() const
{
QSettings settings;
return settings.value(propertyName(__FUNCTION__)).toBool();
}
Или, может быть, есть более простой метод как это сделать?
Про макросы забыл?
C++ (Qt)
#define PROPERTY(type, name) \
type get_##name() const { QSettings s; return s.value<type>(#name); } \
void set_##name(const type& val) { QSettings s; s.setValue(#name, val); } \
Q_PROPERTY(type name READ get_##name WRITE set_##name);
А если использовать BOOST Preprocessor, там можно вообще намутить красоту. Я когда-то себе делал генерилку настроечных классов, пользоваться можно было примерно так:
C++ (Qt)
// MySettings.h
#define MY_SETTINGS \
(string, title, "My title", "This is window title property") \
(int, count, 10, "Some stored count value")
GENERATE_SETTINGS_CLASS_DECLARATION(MySettings, MY_SETTINGS);
// MySettings.cpp
GENERATE_SETTINGS_CLASS_DEFINITION(MySettings, MY_SETTINGS);
В итоге получался класс, с кучей свойств и с различными плюшками типа, сгенерить файл с дефолтным конфигом с комментарием к каждому параметру.