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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Q_PROPERTY(.... NOTIFY ....)  (Прочитано 11617 раз)
Rcus
Гость
« : Сентябрь 03, 2009, 16:44 »

В Qt4.5 задокументирована возможность описания связи между свойством и сигналом уведомляющим об изменении. Собственно дальше и начинаются проблемы. Насколько я понял эта часть разрабатывалась для QtScript/QML, но хотелось бы использовать эту возможность в C++ для задания взаимных связей между виджетами и свойствами без необходимости явности прописывать два коннекта.
Можно было бы просто посмотреть на макрос SIGNAL и возвращать необходимую для QObject::connect строку при помощи notifySignal.signature(), но данный метод даже издалека кажется неправильным. Еще можно забить на все попытки и опробовать Boost.Signals + Boost.Variant ++, но в такие дебри лезть что-то не хочется.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Сентябрь 03, 2009, 17:29 »

В Qt4.5 задокументирована возможность

А можешь ссылку дать, охото почитать?

Цитировать
Q_PROPERTY(type name
            READ getFunction
            [WRITE setFunction]
            [RESET resetFunction]
            [NOTIFY notifySignal]
            [DESIGNABLE bool]
            [SCRIPTABLE bool]
            [STORED bool]
            [USER bool])

...

A NOTIFY signal is optional. If defined, the signal will be emitted whenever the value of the property changes. The signal must take one parameter, which must be of the same type as the property; the parameter will take the new value of the property.
« Последнее редактирование: Сентябрь 03, 2009, 17:32 от AX » Записан
Rcus
Гость
« Ответ #2 : Сентябрь 03, 2009, 17:30 »

http://qt.nokia.com/doc/4.5/qmetaproperty.html#notifySignal
//странно в 4.5/4.4 описании нет, в 4.3 и 4.6 есть
http://qt.nokia.com/doc/4.6-snapshot/properties.html
http://labs.trolltech.com/blogs/2008/08/29/data-bindings/
Записан
SABROG
Гость
« Ответ #3 : Сентябрь 03, 2009, 17:36 »

Да я уже нашел, спс. Если я перефразирую вопрос следующим образом, это будет правильно?

"Что мне подставлять в макрос Q_PROPERTY() для параметра NOTIFY?"
Записан
SASA
Гость
« Ответ #4 : Сентябрь 03, 2009, 17:39 »

А не легче ли в функции WRITE сделать emit?
Записан
Rcus
Гость
« Ответ #5 : Сентябрь 03, 2009, 17:43 »

название сигнала же Улыбающийся получается что-то типа
Код
C++ (Qt)
Q_PROPERTY(double angle READ angle WRITE setAngle NOTIFY angleChanged)
..
const QMetaObject *mo = o->metaObject();
int idx = mo->indexOfProperty("angle");
Q_ASSERT_X(idx >= 0,"bind", "property not found");
QMetaProperty p = mo->property(idx);
Q_ASSERT_X(p.isValid() && p.isReadable() && p.isWritable() && p.hasNotifySignal(), "bind", "invalid property declaration");
QMetaMethod sig = p.notifySignal();
//а дальше хотелось бы чего-нибудь типа QObject::connect(o, sig, receiver, SLOT(dispatch()));
 
Записан
Rcus
Гость
« Ответ #6 : Сентябрь 03, 2009, 17:45 »

А не легче ли в функции WRITE сделать emit?
эм, да в общем без этого никак, но это лишь необходимое условие для связи, и все работает, но писать много приходится. А хочется что-нибудь типа KConfigXT но более динамичного.
Записан
SABROG
Гость
« Ответ #7 : Сентябрь 03, 2009, 17:48 »

Цитировать
//а дальше хотелось бы чего-нибудь типа QObject::connect(o, sig, receiver, SLOT(dispatch()));
Макрос SIGNAL() всего-лишь создает Си строку. Поэтому такое должно прокатить:

Код
C++ (Qt)
QObject::connect(o, sig.signature(), receiver, SLOT(dispatch()));
 

Цитировать
но данный метод даже издалека кажется неправильным.
А другого в Qt нет, там все коннекты через текстовую строку задаются.
Записан
Rcus
Гость
« Ответ #8 : Сентябрь 03, 2009, 17:51 »

Да я вообще-то не первый день работаю с Qt, знаю что делает макрос SIGNAL, можно было бы вручную создать необходимую строку (а при коннекте проверяется первый символ в параметрах сигнала/слота), но кажется я повторяюсь.
Записан
SABROG
Гость
« Ответ #9 : Сентябрь 03, 2009, 17:57 »

Да я вообще-то не первый день работаю с Qt, знаю что делает макрос SIGNAL, можно было бы вручную создать необходимую строку (а при коннекте проверяется первый символ в параметрах сигнала/слота), но кажется я повторяюсь.

А в чем тогда был вопрос, если ты и так знаешь, что другой возможности сделать connect нету? Например передав в качестве параметра в connect QMetaMethod.
Записан
Rcus
Гость
« Ответ #10 : Сентябрь 03, 2009, 18:00 »

А в чем тогда был вопрос, если ты и так знаешь, что другой возможности сделать connect нету? Например передав в качестве параметра в connect QMetaMethod.
Да в общем-то думал может что-то пропустил в документации, или есть какой-то неведомый мне простой способ. /* sigh */ Прошу прощения за потраченное время, отчаялся, слабину дал - тему создал.
Записан
SABROG
Гость
« Ответ #11 : Сентябрь 03, 2009, 18:25 »

У QMetaObject'a есть свой статический метод connect. Он для внутреннего использования, но вроде как не приватный, но и не документированный. Попробуй, может чего получится.

Код
C++ (Qt)
struct Q_CORE_EXPORT QMetaObject
{
   const char *className() const;
   const QMetaObject *superClass() const;
 
   QObject *cast(QObject *obj) const;
...
   // internal index-based connect
   static bool connect(const QObject *sender, int signal_index,
                       const QObject *receiver, int method_index,
                       int type = 0, int *types = 0);
   // internal index-based disconnect
   static bool disconnect(const QObject *sender, int signal_index,
                          const QObject *receiver, int method_index);
   // internal slot-name based connect
   static void connectSlotsByName(QObject *o);
 
 

Кстати может быть какие-то вещи можно почерпнуть из Connection Analizyer

Кстати вот статейка есть в QQ на эту тему, там какраз описывается метод QMetaObject::connect: http://doc.trolltech.com/qq/qq16-dynamicqobject.html
« Последнее редактирование: Сентябрь 03, 2009, 18:39 от SABROG » Записан
Rcus
Гость
« Ответ #12 : Сентябрь 03, 2009, 18:43 »

Спасибо, довольно интересно Улыбающийся Получается ситуация аналогичная Q_PRIVATE_SLOT Улыбающийся Использовать очень хочется и с виду это безопасно, но черт знает что может случиться в будущем :\
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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