Russian Qt Forum
Апрель 20, 2024, 13:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Найти имя property по его геттеру/сеттеру  (Прочитано 1850 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Август 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();
}
 

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

ArchLinux x86_64 / Win10 64 bit
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Август 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);
 

В итоге получался класс, с кучей свойств и с различными плюшками типа, сгенерить файл с дефолтным конфигом с комментарием к каждому параметру.
« Последнее редактирование: Август 30, 2014, 18:09 от navrocky » Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 22.