Russian Qt Forum

Qt => Общие вопросы => Тема начата: Rcus от Сентябрь 03, 2009, 16:44



Название: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Rcus от Сентябрь 03, 2009, 16:44
В Qt4.5 задокументирована возможность описания связи между свойством и сигналом уведомляющим об изменении. Собственно дальше и начинаются проблемы. Насколько я понял эта часть разрабатывалась для QtScript/QML, но хотелось бы использовать эту возможность в C++ для задания взаимных связей между виджетами и свойствами без необходимости явности прописывать два коннекта.
Можно было бы просто посмотреть на макрос SIGNAL и возвращать необходимую для QObject::connect строку при помощи notifySignal.signature(), но данный метод даже издалека кажется неправильным. Еще можно забить на все попытки и опробовать Boost.Signals + Boost.Variant ++, но в такие дебри лезть что-то не хочется.


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Alex Custov от Сентябрь 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.


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Rcus от Сентябрь 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/


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: SABROG от Сентябрь 03, 2009, 17:36
Да я уже нашел, спс. Если я перефразирую вопрос следующим образом, это будет правильно?

"Что мне подставлять в макрос Q_PROPERTY() для параметра NOTIFY?"


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: SASA от Сентябрь 03, 2009, 17:39
А не легче ли в функции WRITE сделать emit?


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Rcus от Сентябрь 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()));
 


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Rcus от Сентябрь 03, 2009, 17:45
А не легче ли в функции WRITE сделать emit?
эм, да в общем без этого никак, но это лишь необходимое условие для связи, и все работает, но писать много приходится. А хочется что-нибудь типа KConfigXT но более динамичного.


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

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

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


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Rcus от Сентябрь 03, 2009, 17:51
Да я вообще-то не первый день работаю с Qt, знаю что делает макрос SIGNAL, можно было бы вручную создать необходимую строку (а при коннекте проверяется первый символ в параметрах сигнала/слота), но кажется я повторяюсь.


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

А в чем тогда был вопрос, если ты и так знаешь, что другой возможности сделать connect нету? Например передав в качестве параметра в connect QMetaMethod.


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Rcus от Сентябрь 03, 2009, 18:00
А в чем тогда был вопрос, если ты и так знаешь, что другой возможности сделать connect нету? Например передав в качестве параметра в connect QMetaMethod.
Да в общем-то думал может что-то пропустил в документации, или есть какой-то неведомый мне простой способ. /* sigh */ Прошу прощения за потраченное время, отчаялся, слабину дал - тему создал.


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: SABROG от Сентябрь 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 (http://www.opendesktop.org/content/show.php/Conan+-+Connection+analyzer?content=108330)

Кстати вот статейка есть в QQ на эту тему, там какраз описывается метод QMetaObject::connect: http://doc.trolltech.com/qq/qq16-dynamicqobject.html


Название: Re: Q_PROPERTY(.... NOTIFY ....)
Отправлено: Rcus от Сентябрь 03, 2009, 18:43
Спасибо, довольно интересно :) Получается ситуация аналогичная Q_PRIVATE_SLOT :) Использовать очень хочется и с виду это безопасно, но черт знает что может случиться в будущем :\