рдореЗрд░реЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ Qt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ - рдХреНрдпреЛрдВ рди рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рдП? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рдкрд░рд┐рдЪрд┐рдд рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд╕реНрд▓реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреА-рдмрд╕ рдпрд╛ рдХреНрдпреВрдореЛрдЯрд╛рдЗрд╕рд┐рдЧреНрдирд▓, рд▓реЗрдХрд┐рди рд╡реЗ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╡реЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред
рд╕рд╣рдордд рд╣реВрдБ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛:
рдХрдВрдкреНрдпреВрдЯрд░ 1:
рдХрдВрдкреНрдпреВрдЯрд░ 2:
рдиреЗрдЯ рдХрд┐рд╕реА рднреА рд╕рд╛рд░ рдиреЗрдЯрд╡рд░реНрдХ рдПрдХреНрд╕реЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ
рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рдпрд╛ рд╕рдВрдХреЗрддреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рддреБрд░рдВрдд рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ! рдЖрдк рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ Qt Quick рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рдЕрднреА рднреА рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛, рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрд┐рд╕реА рднреА рд╕реНрд▓реЙрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛, рдЖрдк рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ - рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред
1. рдЧреБрдг
рдкрд╣рд▓реЗ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕реА рднреА рдЧреБрдг рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдП, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: <рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо, рдирдпрд╛ рдореВрд▓реНрдп>
рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдкрд░ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╣рд┐рдд рд╣реИ - рдпрджрд┐ рд╣рдо рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдПрдХ рд╕реНрд▓реЙрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдПрдВрдЧреЗред рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЗрд╖рдХ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рд╕рдиреЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рдпрд╣ рддреБрд░рдВрдд рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдФрд░ рдПрдХ рдирдпрд╛ рд╕рдВрдХреЗрдд рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рдеред
рдорд╛рдереЗ рдХреА рд╡рд┐рдзрд┐
Class Property { public: Proprety(const QString &name) : m_name(name) {} public slots: void propertyChanged(const QVariant &newValue) { emit mapped(m_name, newValue); } signals: void mapped(const QString &propertyName, const QVariant &newValue); }
рдЕрдм рдпрджрд┐ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдг p1, P2 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
PropertyMapper *m1 = new PropertyMapper("p1"); connect(object, SIGNAL(p1Changed(QVariant)), m1, SLOT(propertyChanged(QVariant)); PropertyMapper *m2 = new PropertyMapper("p2"); connect(object, SIGNAL(p2Changed(QVariant)), m2, SLOT(propertyChanged(QVariant));
рдЕрдЧрд▓рд╛, рд╣рдо рдХреЗрд╡рд▓ рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ PropertyMapper :: рдореИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдФрд░ рдЙрд╕рдХреЗ рдирдП рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдк рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рд╕реНрдореГрддрд┐ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрд░реНрдмрд╛рджреА, рд╕рд╛рде рд╣реА, рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд▓реЙрдЯ рдмрдирд╛рдП рдмрд┐рдирд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдХреНрд╖рдорддрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
рдЙрдиреНрдирдд рд╡рд┐рдзрд┐
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕реНрд▓реЙрдЯ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ QObject :: рдХрдиреЗрдХреНрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕реНрд▓реЙрдЯ рдХреЙрд▓
Q_OBJECT рдореИрдХреНрд░реЛ рдХреЛ qt_metacall () рд╡рд┐рдзрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред рдпрд╣ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ рдХрд┐ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЧреБрдг рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрд▓реЙрдЯ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬрд╛рдВрдЪ, рдЗрд╕рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рдХрдореА рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
int Counter::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { switch (_id) { case 0: valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break; case 1: setValue((*reinterpret_cast< int(*)>(_a[1]))); break; } _id -= 2; } return _id; }
QObject :: рдХрдиреЗрдХреНрдЯ
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдЦреЗрдВ:
1) рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг, рдЕрд░реНрдерд╛рддреНред рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рди, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА QMetaObject :: normalizedSignature ())
2) рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ
3) рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-> рдореЗрдЯрд╛рдСрдмреНрдЬреЗрдХреНрдЯ () -> рдЗрдВрдбреЗрдХреНрд╕рдСрдлрд╕реНрд▓реЛрдЯ (рдЗрдВрдбреЗрдХреНрд╕рдСрдлрд╕рд┐рдЧреНрдирд▓) () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рдирд╛рдо рд╕реЗ рд╕реНрд▓реЙрдЯреНрд╕ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рдЧрдгрдирд╛ред
4) рдФрд░ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк QMetaObject :: connect () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЕрдкрдиреЗ qt_metacall рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЖрдЗрдП рд╢реБрд░реВ:
PropertyMapper.h
class PropertyMapper : public QObject
рдореИрдВ рдкреЗрдВрдЯ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЕрдм рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреВрд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдкреНрд░реЙрдкрд░реНрдЯреА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдирд╛, рдФрд░ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдПрдВ рдореИрдкрд┐рдВрдЧрдкреНрд░реЛрдкрд░рд┐рдирд╛рдо рдХреА рдореИрдкрд┐рдВрдЧрдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╣реЛрдЧреАред рдЕрдЧрд░ рд╣рдо Qt рдХреНрд╡рд┐рдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдлреЛрдХрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ isQuickProperty рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдмрд╛рдж рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдкрд╣рд▓реЗ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕реА рдирд╛рдо рд╕реЗ рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рд╣реИред (m_propertyIndices рдореЗрдВ рдЬреЛрдбрд╝реЗ рдкреНрд░реЙрдкрд░реНрдЯреА_рдирд╛рдо - рдкреНрд░реЙрдкрд░реНрдЯреА_рдЗрдВрдбреЗрдХреНрд╕):
int PropertyMapper::addProperty(const QString &propertyName, const char *mappingPropertyName, QObject *mappingObject, bool isQuickProperty) { if (m_propertyIndices.contains(propertyName)) { qWarning() << "can't create" << propertyName << "property, already exist!"; return -1; }
рд╣рдореЗрдВ рдкреНрд░реЙрдкрд░реНрдЯреА рдЗрдВрдбреЗрдХреНрд╕ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ QMetaProperty рдЗрдВрдбреЗрдХреНрд╕:
int propertyIdx = mappingObject->metaObject()->indexOfProperty(mappingPropertyName); QMetaProperty metaProperty = mappingObject->metaObject()->property(propertyIdx);
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рд╣реЗрдЬреЗрдВ:
int id = m_properties.size(); m_propertyIndices[propertyName] = id; m_properties.push_back({propertyName, metaProperty.type(), mappingPropertyName, mappingObject, isQuickProperty, QVariant()});
рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдВрдХреЗрдд рд╕реВрдЪрдХрд╛рдВрдХ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ (metaProperty.type ()) рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдбрд╛рд▓реЗрдВрдЧреЗ:
int signalId = metaProperty.notifySignalIndex(); if (signalId < 0) { qWarning() << "can't create" << propertyName << "(notify signal doesn't exist)"; return -1; } if (!QMetaObject::connect(mappingObject, signalId, this, id + metaObject()->methodCount())) { qWarning() << "can't connect to notify signal:" << mappingPropertyName; return -1; } return id; }
рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, qt_metacall ():
int PropertyMapper::qt_metacall(QMetaObject::Call call, int id, void **arguments) {
рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдмрдЪрд╛рдИ рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ:
property_t &p = m_properties[id];
рддреНрд╡рд░рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ: рддреНрд╡рд░рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХрд╛ рд░реВрдк рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ () рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рд╣рдо рдХреЗрд╡рд▓ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ (рд╣рдо рдПрдХ рд╕рдВрдХреЗрдд рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ Q_OBJECT рдореИрдХреНрд░реЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдмреЗрд╢рдХ рдЖрдк рдЗрд╕реЗ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВ рдХрд░реЗрдВ ...):
QVariant value; if (p.isQuickProperty) { value = p.mappingObject->property(p.mappingName); } else { const void *data = arguments[1]; value = QVariant(p.type, data); } if (value != p.lastValue) { p.lastValue = value; QMetaObject::invokeMethod(m_mapTo, m_toMethod, Q_ARG(QString, p.name), Q_ARG(QVariant, value)); } return -1; }
рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЛ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ рддрдм рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдФрд░ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реЛ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрдИ рдкреНрд░рддрд┐рднрд╛рдЧреА рд╣реИрдВ, рддреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрд╛рд╣рд░ рд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рд╣рд┐рдорд╕реНрдЦрд▓рди рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ рдЙрд╕реА рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛) рдореВрд▓реНрдп)ред
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
Reciever reciever; PropertyMapper mapper(&reciever, "mapped"); Tester tester; mapper.addProperty("value_m", "value", &tester); mapper.addProperty("name_m", "name", &tester); tester.setName("Button1"); tester.setValue(123);
рдкрд░реАрдХреНрд╖рдХ - рдХреЗрд╡рд▓ рджреЛ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
Q_INVOKABLE void mapped(const QString &propertyName, const QVariant &newValue) { qDebug() << propertyName << newValue; }
рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:
"Name_m" QVariant (QString, "Button1")
"Value_m" QVariant (int, 123)
рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реА :)
рдкреВрд░реА рдХрдХреНрд╖рд╛