Russian Qt Forum

Qt => Общие вопросы => Тема начата: kuzulis от Август 30, 2014, 17:44



Название: Найти имя property по его геттеру/сеттеру
Отправлено: kuzulis от Август 30, 2014, 17:44
Всем доброго времени.

Делаю обертку над 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();
}
 

Или, может быть, есть более простой метод как это сделать?


Название: Re: Найти имя property по его геттеру/сеттеру
Отправлено: navrocky от Август 30, 2014, 18:01
Про макросы забыл?

Код
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);
 

В итоге получался класс, с кучей свойств и с различными плюшками типа, сгенерить файл с дефолтным конфигом с комментарием к каждому параметру.