рдХреИрд╕реЗ рд╕рдВрдХреЗрдд рдФрд░ рд╕реНрд▓реЙрдЯ Qt рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рднрд╛рдЧ 1)



Qt рдЕрдкрдиреЗ рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо QObject рдФрд░ QMetaObject рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рд╕реЗ рдЙрдирдХреЗ рдХрд╛рдо рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ Qt5 рдХреЛрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рдХрднреА-рдХрднреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдФрд░ рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ

рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВред рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

class Counter : public QObject { Q_OBJECT int m_value; public: int value() const { return m_value; } public slots: void setValue(int value); signals: void valueChanged(int newValue); }; 

рдХрд╣реАрдВ рди рдХрд╣реАрдВ, рдПрдХ .cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо setValue () рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ :

 void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); } } 

рдлрд┐рд░, рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдЙрдВрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 Counter a, b; QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); a.setValue(12); // a.value() == 12, b.value() == 12 

рдпрд╣ рдореВрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЬреЛ 1992 рдореЗрдВ рдХреНрдпреВрдЯреА рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рдХреЛрд░ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реЛ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдИ рдмрд╛рд░ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд╣реБрдб рдХреЗ рддрд╣рдд, рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реБрдИрдВред рдпрд╣рд╛рдВ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

MOC рдпрд╛ рдореЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░

рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ, рд╕рд╛рде рд╣реА рдЧреБрдгреЛрдВ рдХреА рдХреНрдпреВрдЯреА рдкреНрд░рдгрд╛рд▓реА, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрддреНрдо-рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рдЧреБрдгреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред QtScript рдФрд░ QML рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╢рд╛рдпрдж рд╣реА рд╕рдВрднрд╡ рд╣реЛрддрд╛ред

рд╕реА ++ рджреЗрд╢реА рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреНрдпреВрдЯреА рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЯреВрд▓ рдХреЛ MOC рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╣реИ (рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ)ред

рдпрд╣ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд C ++ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╛рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрддреНрдкрдиреНрди C ++ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
рдХреНрдпреВрдЯреА рдХреЛ рдХрднреА-рдХрднреА рднрд╛рд╖рд╛ рд╢реБрджреНрдзрддрд╛рд╡рд╛рджрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╣реИред рдореИрдВ рдХреНрдпреВрдЯреА рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдЗрд╕ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреВрдВрдЧрд╛ ред рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ рдФрд░ MOC рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рд╣рд╛рдпрдХ рд╣реИред

рдореИрдЬрд┐рдХ рдореИрдХреНрд░реЛрдВ

рдХреНрдпрд╛ рдЖрдк рдРрд╕реЗ рдХреАрд╡рд░реНрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ C ++ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИрдВ? рд╕рдВрдХреЗрдд , рд╕реНрд▓реЙрдЯреНрд╕ , Q_OBJECT , emit , SIGNAL , SLOT ред рдЙрдиреНрд╣реЗрдВ C ++ рдХреЗ рд▓рд┐рдП Qt рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИрдВ рдЬреЛ рдХрд╝реЛрдмрд┐рдЬрд╝рдбреЗрдлрд╝рд┐рд╢ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

 #define signals public #define slots /* nothing */ 

рд╕рдЪ рд╣реИ, рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИрдВ: рд╕рдВрдХрд▓рдХ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдХреНрд░реЛрдЬрд╝ рдЕрднреА рднреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджреНрджреЗрд╢реНрдп рдХреА рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ: рдПрдордУрд╕реА рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрддрд╛ рд╣реИред рд╕рдВрдХреЗрдд Qt4 рдФрд░ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЦрдВрдб рдореЗрдВ рдереЗред рд▓реЗрдХрд┐рди Qt5 рдореЗрдВ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВред

 #define Q_OBJECT \ public: \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ virtual void *qt_metacast(const char *); \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ QT_TR_FUNCTIONS /*   */ \ private: \ Q_DECL_HIDDEN static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); 

Q_OBJECT рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ QMetaObject рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпреЗ рдХрд╛рд░реНрдп MOC рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

 #define emit /* nothing */ 

рдПрдорд┐рдЯ рдПрдХ рдЦрд╛рд▓реА рдореИрдХреНрд░реЛ рд╣реИред рдпрд╣ MOC рдХреЛ рдкрд╛рд░реНрд╕ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрддреНрд╕рд░реНрдЬрди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ (рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред

 Q_CORE_EXPORT const char *qFlagLocation(const char *method); #ifndef QT_NO_DEBUG # define QLOCATION "\0" __FILE__ ":" QTOSTRING(__LINE__) # define SLOT(a) qFlagLocation("1"#a QLOCATION) # define SIGNAL(a) qFlagLocation("2"#a QLOCATION) #else # define SLOT(a) "1"#a # define SIGNAL(a) "2"#a #endif 

рдЗрди рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ, рд╣рдо рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рднреА рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП Qt 4.5 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рд╣рдо qFlagLocation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рджреЛ рд╕рдорд╛рд╡реЗрд╢рди рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдкрддреЗ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред

рдЕрдм MOC рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

QMetaObject

 const QMetaObject Counter::staticMetaObject = { { &QObject::staticMetaObject, qt_meta_stringdata_Counter.data, qt_meta_data_Counter, qt_static_metacall, 0, 0 } }; const QMetaObject *Counter::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } 

рдпрд╣рд╛рдВ рд╣рдо рдХрд╛рдЙрдВрдЯрд░ :: рдореЗрдЯрд╛рдСрдмреНрдЬреЗрдХреНрдЯ () рдФрд░ рдХрд╛рдЙрдВрдЯрд░ :: staticMetaObject рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ Q_OBJECT рдореИрдХреНрд░реЛ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред QObject :: d_ptr-> metaObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ ( QML рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕) рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди metaObject () рдмрд╕ рдПрдХ staticMetaObject рдХреНрд▓рд╛рд╕ рджреЗрддрд╛ рд╣реИред staticMetaObject рд░реАрдб-рдУрдирд▓реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред QMetaObject рдХреЛ qobjectdefs.h рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 struct QMetaObject { /* ...     ... */ enum Call { InvokeMetaMethod, ReadProperty, WriteProperty, /*...*/ }; struct { //   const QMetaObject *superdata; const QByteArrayData *stringdata; const uint *data; typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); StaticMetacallFunction static_metacall; const QMetaObject **relatedMetaObjects; void *extradata; //     } d; }; 

рдбреА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ рдХрд┐ рд╕рднреА рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡реЗ POD рдФрд░ рд╕реНрдереИрддрд┐рдХ рдкреНрд░рд╛рд░рдВрдн рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреЗ рдирд╣реАрдВ рд╣реИрдВред

QMetaObject рдХреЛ рдкреИрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рд╕реБрдкрд░рдбреЗрдЯрд╛ рдХреА рдореЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ (QObject :: staticMetaObject рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрдЯреНрд░реИрдВрдбрд┐рдВрдЧрдЯрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред static_metacall рдХрд╛рдЙрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реВрдЪрдХ рд╣реИ :: qt_static_metacallред

рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рд╕рд╛рд░рдгреА

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП QMetaObject рдХреЗ рдореВрд▓ рдбреЗрдЯрд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

 static const uint qt_meta_data_Counter[] = { // content: 7, // revision 0, // classname 0, 0, // classinfo 2, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags 1, // signalCount // signals: name, argc, parameters, tag, flags 1, 1, 24, 2, 0x05, // slots: name, argc, parameters, tag, flags 4, 1, 27, 2, 0x0a, // signals: parameters QMetaType::Void, QMetaType::Int, 3, // slots: parameters QMetaType::Void, QMetaType::Int, 5, 0 // eod }; 

рдкрд╣рд▓реЗ 13 рдЗрдВрдЪ рд╣реЗрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рджреЛ рдХреЙрд▓рдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдкрд╣рд▓рд╛ рдХреЙрд▓рдо рдорд╛рддреНрд░рд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЙрд╕ рд╕рд░рдгреА рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рд╡рд░рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди 14 рдХреЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди 5 int рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдирд╛рдо рд╣реИ, рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ (рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ)ред рджреВрд╕рд░рд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реВрдЪрдХрд╛рдВрдХ, рдЬрд╣рд╛рдВ рд╣рдо рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдЯреИрдЧ рдФрд░ рдЭрдВрдбреЗ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, MOC рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░, рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдирд╛рдо рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛

 struct qt_meta_stringdata_Counter_t { QByteArrayData data[6]; char stringdata[47]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ offsetof(qt_meta_stringdata_Counter_t, stringdata) + ofs \ - idx * sizeof(QByteArrayData) \ ) static const qt_meta_stringdata_Counter_t qt_meta_stringdata_Counter = { { QT_MOC_LITERAL(0, 0, 7), QT_MOC_LITERAL(1, 8, 12), QT_MOC_LITERAL(2, 21, 0), QT_MOC_LITERAL(3, 22, 8), QT_MOC_LITERAL(4, 31, 8), QT_MOC_LITERAL(5, 40, 5) }, ""Counter\0valueChanged\0\0newValue\0setValue\0"" ""value\0"" }; #undef QT_MOC_LITERAL 

рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ QByteArray рд╕рд░рдгреА ( QT_MOC_LITERAL рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ) рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рджреА рдЧрдИ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдХреЗрдд

MOC рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпреВрдЕрд░ рдХрд╛ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ QMetaObject :: рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ ред рд╕рд░рдгреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ 0 рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╢реВрдиреНрдп рд╣реИред рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╕рдВрдХреЗрдд рд╕реВрдЪрдХрд╛рдВрдХ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 0) рд╣реИред

 // SIGNAL 0 void Counter::valueChanged(int _t1) { void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 0, _a); } 

рд╕реНрд▓реЙрдЯ рдХреЙрд▓

Qt_static_metacall рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реНрд▓реЙрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ:

 void Counter::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { Counter *_t = static_cast<Counter *>(_o); switch (_id) { case 0: _t->valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break; case 1: _t->setValue((*reinterpret_cast< int(*)>(_a[1]))); break; default: ; } ... } ... } 


рд╕рдВрдХреЗрдд рдореЗрдВ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВред _a [0] рдХреЛ рдЫреБрдЖ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп рд╣рд░ рдЬрдЧрд╣ рд▓реМрдЯрддрд╛ рд╣реИред

рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдВ

рдкреНрд░рддреНрдпреЗрдХ QMetaObject рдХреЗ рд▓рд┐рдП , рд╕рд┐рдЧреНрдирд▓, рд╕реНрд▓реЙрдЯ, рдФрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдиреНрдп рддрдерд╛рдХрдерд┐рдд рддрд░реАрдХреЗ, рдЗрдВрдбреЗрдХреНрд╕ 0. рд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдСрд░реНрдбрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рд┐рдЧреНрдирд▓ рдкрд╣рд▓реЗ рдЖрдПрдВ, рдлрд┐рд░ рд╕реНрд▓реЙрдЯ рдФрд░ рдлрд┐рд░ рдЕрдиреНрдп рддрд░реАрдХреЗред рдЕрдВрджрд░ рдХреЗ рдЗрди рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рдПрдХ рдЕрдзрд┐рдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдирд╣реАрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд░рд╛рд╕рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрд╕ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдПрдХ рдСрдлрд╕реЗрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкреВрд░реНрдг рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдлреЙрд░реНрдо QMetaObject :: indexOf {рд╕рд┐рдЧреНрдирд▓, рд╕реНрд▓реЙрдЯ, рд╡рд┐рдзрд┐} рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреБрдбрд╝рдиреЗ рдХрд╛ рддрдВрддреНрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдорд┐рдд рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рднреА рд╕реНрд▓реЙрдЯ рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрд▓реЙрдЯ рд╣реЛрддреЗ рд╣реИрдВред рддреЛ, рдХреНрдпреВрдЯреА 4.6 рдХреЗ рд╕рд╛рде, рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЖрдВрддрд░рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреНрдпреВрдЯреА рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк QObject рдХреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реЛрдВ , рддреЛ рдЖрдкрдХреЛ рдЗрди рддреАрдиреЛрдВ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрдиреЗрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рджреЗрдЦрдирд╛ рд╣реИред Qt рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреА рдЦреЛрдЬ рдореЗрдВ рдореЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдЧрд╛ред рдлрд┐рд░, рдПрдХ QObjectPStreet :: рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдВрддрд░рд┐рдХ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЬрд╛рдирдХрд╛рд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рд╣рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рд┐рдЧреНрдирд▓ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдПрдХ рд╣реА рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдХрдИ рд╕реНрд▓реЙрдЯ рдЬреБрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯреЗрдб рд╕реНрд▓реЙрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд╕реНрд▓реЙрдЯ рдЗрдВрдбреЗрдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдпрд╣ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдПрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рдХрд┐рд╕рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рдХрдиреЗрдХреНрд╢рди рд╣рдЯрд╛ рд╕рдХреЗред

рдпрд╣рд╛рдБ QObjectPStreet :: Qobject_p.h рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрдиреЗрдХреНрд╢рди рд╣реИ:

 struct QObjectPrivate::Connection { QObject *sender; QObject *receiver; union { StaticMetaCallFunction callFunction; QtPrivate::QSlotObjectBase *slotObj; }; //      ConnectionList Connection *nextConnectionList; //    Connection *next; Connection **prev; QAtomicPointer<const int> argumentTypes; QAtomicInt ref_; ushort method_offset; ushort method_relative; uint signal_index : 27; //    ( QObjectPrivate::signalIndex()) ushort connectionType : 3; // 0 == auto, 1 == direct, 2 == queued, 4 == blocking ushort isSlotObject : 1; ushort ownArgumentTypes : 1; Connection() : nextConnectionList(0), ref_(2), ownArgumentTypes(true) { // ref_ 2        QMetaObject::Connection } ~Connection(); int method() const { return method_offset + method_relative; } void ref() { ref_.ref(); } void deref() { if (!ref_.deref()) { Q_ASSERT(!receiver); delete this; } } }; 

рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ: рдпрд╣ рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рдЧреНрдирд▓ рдХреЛ QObjectPrivate :: рдХрдиреЗрдХреНрд╢рди рд╕реВрдЪреА рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рд▓реЛрдкрди рдХреЗ рд▓рд┐рдП рдЬреБрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреА рдЙрд▓рдЯреА рд╕реВрдЪреА рднреА рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдХ рдбрдмрд▓ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рд╣реИред

рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ QObjectPrivate :: рдХрдиреЗрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЕрдЧрд▓реЗ / рдкрд┐рдЫрд▓реЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░реЗрд╖рдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕реВрдЪрдХ рдПрдХ рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдиреЛрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдЧрд▓реЗ рдиреЛрдб рдХреЗ рд▓рд┐рдПред рдЗрд╕ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╕рдВрдХреЗрдд рдЙрддреНрд╕рд░реНрдЬрди

рдЬрдм рд╣рдо рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ MOC рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА QMetaObject :: рдХреЙрд▓ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ ред рдпрд╣рд╛рдБ qobject.cpp рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдиреЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде) рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_signal_index, void **argv) { /*      ,     */ activate(sender, QMetaObjectPrivate::signalOffset(m), local_signal_index, argv); } void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_index, void **argv) { int signal_index = signalOffset + local_signal_index; /*      64 ,   0,  ,            ,          */ if (!sender->d_func()->isSignalConnected(signal_index)) return; //      /* тАж     QML ,   ... */ /*  ,      connectionLists  */ QMutexLocker locker(signalSlotLock(sender)); /*  connectionList   ( ) */ QObjectConnectionListVector *connectionLists = sender->d_func()->connectionLists; const QObjectPrivate::ConnectionList *list = &connectionLists->at(signal_index); QObjectPrivate::Connection *c = list->first; if (!c) continue; //    last,  ,       ,    QObjectPrivate::Connection *last = list->last; /* ,    */ do { if (!c->receiver) continue; QObject * const receiver = c->receiver; const bool receiverInSameThread = QThread::currentThreadId() == receiver->d_func()->threadData->threadId; //       ,      if ((c->connectionType == Qt::AutoConnection && !receiverInSameThread) || (c->connectionType == Qt::QueuedConnection)) { /*       */ queued_activate(sender, signal_index, c, argv); continue; } else if (c->connectionType == Qt::BlockingQueuedConnection) { /* ...  ... */ continue; } /*  ,   sender()   ,     */ QConnectionSenderSwitcher sw; if (receiverInSameThread) sw.switchSender(receiver, sender, signal_index); const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction; const int method_relative = c->method_relative; if (c->isSlotObject) { /* тАж  тАж  Qt5      ... */ } else if (callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) { /*    callFunction (  qt_static_metacall,  MOC),    */ /*   ,   metodOffset  (    ) */ locker.unlock(); //          callFunction(receiver, QMetaObject::InvokeMetaMethod, method_relative, argv); locker.relock(); } else { /*      */ const int method = method_relative + c->method_offset; locker.unlock(); metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv); locker.relock(); } // ,        if (connectionLists->orphaned) break; } while (c != last && (c = c->nextConnectionList) != 0); } 

UPD : рдпрд╣рд╛рдВ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рджред

Source: https://habr.com/ru/post/In214379/


All Articles