diff options
Diffstat (limited to 'sources/pyside6/libpyside')
| -rw-r--r-- | sources/pyside6/libpyside/dynamicqmetaobject.cpp | 6 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/dynamicqmetaobject.h | 6 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/qobjectconnect.cpp | 5 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/signalmanager.cpp | 94 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/signalmanager.h | 8 |
5 files changed, 74 insertions, 45 deletions
diff --git a/sources/pyside6/libpyside/dynamicqmetaobject.cpp b/sources/pyside6/libpyside/dynamicqmetaobject.cpp index 1a15e60df..94ce20226 100644 --- a/sources/pyside6/libpyside/dynamicqmetaobject.cpp +++ b/sources/pyside6/libpyside/dynamicqmetaobject.cpp @@ -207,7 +207,7 @@ int MetaObjectBuilderPrivate::addSlot(const QByteArray &signature) + ensureBuilder()->addSlot(signature).index(); } -int MetaObjectBuilder::addSlot(const char *signature) +int MetaObjectBuilder::addSlot(const QByteArray &signature) { return m_d->addSlot(signature); } @@ -227,7 +227,7 @@ int MetaObjectBuilderPrivate::addSlot(const QByteArray &signature, return m_baseObject->methodCount() + methodBuilder.index(); } -int MetaObjectBuilder::addSlot(const char *signature, const char *type) +int MetaObjectBuilder::addSlot(const QByteArray &signature, const QByteArray &type) { return m_d->addSlot(signature, type); } @@ -241,7 +241,7 @@ int MetaObjectBuilderPrivate::addSignal(const QByteArray &signature) + ensureBuilder()->addSignal(signature).index(); } -int MetaObjectBuilder::addSignal(const char *signature) +int MetaObjectBuilder::addSignal(const QByteArray &signature) { return m_d->addSignal(signature); } diff --git a/sources/pyside6/libpyside/dynamicqmetaobject.h b/sources/pyside6/libpyside/dynamicqmetaobject.h index dd33f65f7..4ea5351c4 100644 --- a/sources/pyside6/libpyside/dynamicqmetaobject.h +++ b/sources/pyside6/libpyside/dynamicqmetaobject.h @@ -31,9 +31,9 @@ public: int indexOfMethod(QMetaMethod::MethodType mtype, const QByteArray &signature) const; int indexOfProperty(const QByteArray &name) const; - int addSlot(const char *signature); - int addSlot(const char *signature, const char *type); - int addSignal(const char *signature); + int addSlot(const QByteArray &signature); + int addSlot(const QByteArray &signature, const QByteArray &type); + int addSignal(const QByteArray &signature); void removeMethod(QMetaMethod::MethodType mtype, int index); int addProperty(const char *property, PyObject *data); void addInfo(const char *key, const char *value); diff --git a/sources/pyside6/libpyside/qobjectconnect.cpp b/sources/pyside6/libpyside/qobjectconnect.cpp index f3c420768..053ccc7ad 100644 --- a/sources/pyside6/libpyside/qobjectconnect.cpp +++ b/sources/pyside6/libpyside/qobjectconnect.cpp @@ -233,8 +233,9 @@ QMetaObject::Connection qobjectConnectCallback(QObject *source, const char *sign const char *slotSignature = receiver.callbackSig.constData(); slotIndex = receiver.usingGlobalReceiver ? signalManager.globalReceiverSlotIndex(receiver.receiver, slotSignature) - : PySide::SignalManager::registerMetaMethodGetIndex(receiver.receiver, slotSignature, - QMetaMethod::Slot); + : PySide::SignalManager::registerMetaMethodGetIndexBA(receiver.receiver, + receiver.callbackSig, + QMetaMethod::Slot); if (slotIndex == -1) { if (receiver.usingGlobalReceiver) diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp index 23ce36cf7..9c1160483 100644 --- a/sources/pyside6/libpyside/signalmanager.cpp +++ b/sources/pyside6/libpyside/signalmanager.cpp @@ -823,47 +823,71 @@ QDebug operator<<(QDebug debug, const slotSignature &sig) return debug; } -int SignalManager::registerMetaMethodGetIndex(QObject *source, const char *signature, QMetaMethod::MethodType type) +static int addMetaMethod(QObject *source, const QByteArray &signature, + QMetaMethod::MethodType type) { - if (!source) { - qWarning("SignalManager::registerMetaMethodGetIndex(\"%s\") called with source=nullptr.", - signature); + const QMetaObject *metaObject = source->metaObject(); + SbkObject *self = Shiboken::BindingManager::instance().retrieveWrapper(source); + if (!Shiboken::Object::hasCppWrapper(self)) { + qWarning().noquote().nospace() << __FUNCTION__ + << ": Cannot add dynamic method \"" << signature << "\" (" << type + << ") to " << source << ": No Wrapper found."; return -1; } - const QMetaObject *metaObject = source->metaObject(); - int methodIndex = metaObject->indexOfMethod(signature); - // Create the dynamic signal is needed - if (methodIndex == -1) { - SbkObject *self = Shiboken::BindingManager::instance().retrieveWrapper(source); - if (!Shiboken::Object::hasCppWrapper(self)) { - qWarning().noquote().nospace() << __FUNCTION__ - << ": Cannot add dynamic method \"" << signature << "\" (" << type - << ") to " << source << ": No Wrapper found."; - return -1; - } - auto *pySelf = reinterpret_cast<PyObject *>(self); - auto *dict = SbkObject_GetDict_NoRef(pySelf); - MetaObjectBuilder *dmo = metaBuilderFromDict(dict); - - // Create a instance meta object - if (!dmo) { - dmo = new MetaObjectBuilder(Py_TYPE(pySelf), metaObject); - PyObject *pyDmo = PyCapsule_New(dmo, nullptr, destroyMetaObject); - PyObject_SetAttr(pySelf, metaObjectAttr, pyDmo); - Py_DECREF(pyDmo); - } - if (type == QMetaMethod::Slot) { - qCWarning(lcPySide).noquote().nospace() - << "Warning: Registering dynamic slot \"" - << signature << "\" on \"" << source->metaObject()->className() - << "\". Consider annotating with " << slotSignature(signature); - } + auto *pySelf = reinterpret_cast<PyObject *>(self); + auto *dict = SbkObject_GetDict_NoRef(pySelf); + MetaObjectBuilder *dmo = metaBuilderFromDict(dict); + // Create a instance meta object + if (dmo == nullptr) { + dmo = new MetaObjectBuilder(Py_TYPE(pySelf), metaObject); + PyObject *pyDmo = PyCapsule_New(dmo, nullptr, destroyMetaObject); + PyObject_SetAttr(pySelf, metaObjectAttr, pyDmo); + Py_DECREF(pyDmo); + } + + if (type == QMetaMethod::Slot) { + qCWarning(lcPySide).noquote().nospace() + << "Warning: Registering dynamic slot \"" + << signature << "\" on \"" << source->metaObject()->className() + << "\". Consider annotating with " << slotSignature(signature); + } + + return type == QMetaMethod::Signal ? dmo->addSignal(signature) : dmo->addSlot(signature); +} + +static inline void warnNullSource(const char *signature) +{ + qWarning("SignalManager::registerMetaMethodGetIndex(\"%s\") called with source=nullptr.", + signature); +} - return type == QMetaMethod::Signal - ? dmo->addSignal(signature) : dmo->addSlot(signature); +int SignalManager::registerMetaMethodGetIndex(QObject *source, const char *signature, + QMetaMethod::MethodType type) +{ + if (source == nullptr) { + warnNullSource(signature); + return -1; } - return methodIndex; + const QMetaObject *metaObject = source->metaObject(); + const int methodIndex = metaObject->indexOfMethod(signature); + // Create the dynamic signal if needed + return methodIndex != -1 + ? methodIndex : addMetaMethod(source, QByteArray(signature), type); +} + +int SignalManager::registerMetaMethodGetIndexBA(QObject* source, const QByteArray &signature, + QMetaMethod::MethodType type) +{ + if (source == nullptr) { + warnNullSource(signature.constData()); + return -1; + } + const QMetaObject *metaObject = source->metaObject(); + const int methodIndex = metaObject->indexOfMethod(signature.constData()); + // Create the dynamic signal if needed + return methodIndex != -1 + ? methodIndex : addMetaMethod(source, signature, type); } const QMetaObject *SignalManager::retrieveMetaObject(PyObject *self) diff --git a/sources/pyside6/libpyside/signalmanager.h b/sources/pyside6/libpyside/signalmanager.h index 443117447..df39e94ad 100644 --- a/sources/pyside6/libpyside/signalmanager.h +++ b/sources/pyside6/libpyside/signalmanager.h @@ -70,8 +70,12 @@ public: static int qt_metacall(QObject* object, QMetaObject::Call call, int id, void** args); // Used to register a new signal/slot on QMetaobject of source. - static bool registerMetaMethod(QObject* source, const char* signature, QMetaMethod::MethodType type); - static int registerMetaMethodGetIndex(QObject* source, const char* signature, QMetaMethod::MethodType type); + static bool registerMetaMethod(QObject* source, const char* signature, + QMetaMethod::MethodType type); + static int registerMetaMethodGetIndex(QObject* source, const char *signature, + QMetaMethod::MethodType type); + static int registerMetaMethodGetIndexBA(QObject* source, const QByteArray &signature, + QMetaMethod::MethodType type); // used to discovery metaobject static const QMetaObject* retrieveMetaObject(PyObject* self); |
