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 *...
if (!strcmp(_clname, qt_meta_stringdata_XTest.stringdata0)) return static_cast<void*>(this); return QObject::qt_metacast(_clname); } int XTest::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return...
virtual void *qt_metacast(const char *); \ QT_TR_FUNCTIONS \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ private: \ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ struct QPrivateSignal {}; 1. 2. ...
const QMetaObject **extradata;//扩展元数据表的指针,内部被填充为函数指针qt_static_metacall。 staticMetaObjectExtraData初始化如下: const QMetaObjectExtraData Object::staticMetaObjectExtraData = { 0, qt_static_metacall }; QMetaObjectExtraData类型的内部成员static_metacall是一个指向Object::qt_static_me...
virtual void *qt_metacast(const char *); \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ QT_TR_FUNCTIONS \ private: \ Q_OBJECT_NO_ATTRIBUTES_WARNING \ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ ...
0, qt_static_metacall }; QMetaObjectExtraData类型的内部成员static_metacall是一个指向Object::qt_static_metacall 的函数指针。 Object的内存布局如下: Object内存布局已经包含了静态成员staticMetaObject和 staticMetaObjectExtraData成员。 const QMetaObject *Object::metaObject() const ...
virtual int qt_metacall(QMetaObject::Call, int, void **); \ QT_TR_FUNCTIONS \ private: \ Q_OBJECT_NO_ATTRIBUTES_WARNING \ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ QT_WARNING_POP \ struct QPrivateSignal {}; \ ...
从qt_static_metacall函数中可以知道信号槽根本不是通过函数指针的方式来匹配的,而是通过对象指针加索引...
这里,qt_static_metacall是由MOC生成的函数,它负责在运行时连接信号和槽,以及分发事件。 6.2 实际应用场景 在实际应用中,我们经常需要在多个QObject之间传递信息或者状态。这时,信号和槽机制就显得尤为重要。它允许我们在不了解对象内部实现的情况下,实现对象之间的通信。
所谓meta call就是通过object的meta system的支持来动态调用object的方法,metacall也是signal&slot的机制的基石。本篇通过参考源代码来探究meta call的实现方法。 QMetaObject::invokeMethod(): boolinvokeMethod( QObject * obj , const char * member , Qt::ConnectionType type , QGenericReturnArgument ret , QGe...