// This is the helper for all implementations of QObject::metaObject(). const QMetaObject *qpycore_qobject_metaobject(sipSimpleWrapper *pySelf, sipTypeDef *base) { // Return the dynamic meta-object if there is one. if (pySelf && ((pyqtWrapperType *)Py_TYPE(pySelf))->metaobject) return QPYCORE_QMETAOBJECT(((pyqtWrapperType *)Py_TYPE(pySelf))->metaobject); // Fall back to the static Qt meta-object. return reinterpret_cast<const QMetaObject *>(((pyqt4ClassTypeDef *)base)->static_metaobject); }
// Return the QMetaObject for a type. static const QMetaObject *get_qmetaobject(pyqtWrapperType *pyqt_wt) { // See if it's a sub-type of a wrapped type. if (pyqt_wt->metaobject) return QPYCORE_QMETAOBJECT(pyqt_wt->metaobject); // It's a wrapped type. const pyqt4ClassPluginDef *cpd = reinterpret_cast<const pyqt4ClassPluginDef *>(sipTypePluginData(((sipWrapperType *)pyqt_wt)->wt_td)); return reinterpret_cast<const QMetaObject *>(cpd->static_metaobject); }
// This does the real work for all implementations of QObject::qt_metacall(). static int qt_metacall_worker(sipSimpleWrapper *pySelf, PyTypeObject *pytype, sipTypeDef *base, QMetaObject::Call _c, int _id, void **_a) { // See if this is a wrapped C++ type rather than a Python sub-type. if (pytype == sipTypeAsPyTypeObject(base)) return _id; _id = qt_metacall_worker(pySelf, pytype->tp_base, base, _c, _id, _a); if (_id < 0) return _id; pyqtWrapperType *pyqt_wt = (pyqtWrapperType *)pytype; qpycore_metaobject *qo = pyqt_wt->metaobject; bool ok = true; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < qo->nr_signals + qo->pslots.count()) { if (_id < qo->nr_signals) { QObject *qthis = reinterpret_cast<QObject *>(sipGetCppPtr(pySelf, sipType_QObject)); Py_BEGIN_ALLOW_THREADS QMetaObject::activate(qthis, QPYCORE_QMETAOBJECT(qo), _id, _a); Py_END_ALLOW_THREADS } else { // We take a copy just to be safe. qpycore_slot slot = qo->pslots.at(_id - qo->nr_signals); // Set up the instance specific parts. slot.sip_slot.meth.mself = (PyObject *)pySelf; PyObject *py = PyQtProxy::invokeSlot(slot, _a); if (!py) ok = false; else { if (_a[0] && slot.signature->result) { ok = slot.signature->result->fromPyObject(py, _a[0]); } Py_DECREF(py); } } }