diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-05-17 15:48:39 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-05-22 14:54:05 +0200 |
| commit | 64bacdf74cc7a32cd5bd60ed50bf5cbe998483ff (patch) | |
| tree | 25491638c9c9f699d167334571d9b10f59c822ec /sources/pyside6/libpyside/pyside.cpp | |
| parent | 639d8096fefa317a3d60c79f70a620f31674c644 (diff) | |
PySide6: Fix connecting signals with arguments by constructor kwargs
The search was only implemented for signals without arguments by
appending "()" to the signal name to form the search signature.
Implement a search by signal name only.
Fixes: PYSIDE-2329
Pick-to: 6.5
Change-Id: I295150cdebe60c886891553c9f31d14011a004d6
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/pyside.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pyside.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp index 29a3d2884..33a05cc0d 100644 --- a/sources/pyside6/libpyside/pyside.cpp +++ b/sources/pyside6/libpyside/pyside.cpp @@ -37,6 +37,7 @@ #include <QtCore/QCoreApplication> #include <QtCore/QDir> #include <QtCore/QFileInfo> +#include <QtCore/QMetaMethod> #include <QtCore/QMutex> #include <QtCore/QStack> #include <QtCore/QThread> @@ -45,6 +46,7 @@ #include <cstring> #include <cctype> #include <memory> +#include <optional> #include <typeinfo> using namespace Qt::StringLiterals; @@ -299,6 +301,21 @@ static bool _setProperty(PyObject *qObj, PyObject *name, PyObject *value, bool * return true; } +// PYSIDE-2329: Search a signal by name (Note: QMetaObject::indexOfSignal() +// searches by signature). +static std::optional<QMetaMethod> findSignal(const QMetaObject *mo, + const QByteArray &name) +{ + const auto count = mo->methodCount(); + for (int i = mo->methodOffset(); i < count; ++i) { + const auto method = mo->method(i); + if (method.methodType() == QMetaMethod::Signal && method.name() == name) + return method; + } + auto *base = mo->superClass(); + return base != nullptr ? findSignal(base, name) : std::nullopt; +} + bool fillQtProperties(PyObject *qObj, const QMetaObject *metaObj, PyObject *kwds, bool allowErrors) { @@ -309,7 +326,7 @@ bool fillQtProperties(PyObject *qObj, const QMetaObject *metaObj, int snake_flag = flags & 0x01; while (PyDict_Next(kwds, &pos, &key, &value)) { - QByteArray propName(Shiboken::String::toCString(key)); + const QByteArray propName = Shiboken::String::toCString(key); QByteArray unmangledName = _sigWithOrigName(propName, snake_flag); bool accept = false; // PYSIDE-1705: Make sure that un-mangled names are not recognized in snake_case mode. @@ -318,11 +335,11 @@ bool fillQtProperties(PyObject *qObj, const QMetaObject *metaObj, if (!_setProperty(qObj, key, value, &accept)) return false; } else { - propName.append("()"); - if (metaObj->indexOfSignal(propName) != -1) { + const auto methodO = findSignal(metaObj, propName); + if (methodO.has_value()) { + const auto signature = "2"_ba + methodO->methodSignature(); accept = true; - propName.prepend('2'); - if (!PySide::Signal::connect(qObj, propName, value)) + if (!PySide::Signal::connect(qObj, signature, value)) return false; } } |
