diff options
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 21 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject.h | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 31 |
3 files changed, 38 insertions, 15 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index e584fbba8e..f0cef22b6f 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -207,6 +207,7 @@ public: inline uint parameterTypeInfo(int index) const; inline int parameterType(int index) const; inline void getParameterTypes(int *types) const; + inline QByteArray parameterTypeName(int index) const; inline QList<QByteArray> parameterTypes() const; inline QList<QByteArray> parameterNames() const; inline QByteArray tag() const; @@ -1780,6 +1781,12 @@ void QMetaMethodPrivate::getParameterTypes(int *types) const } } +QByteArray QMetaMethodPrivate::parameterTypeName(int index) const +{ + int paramsIndex = parametersDataIndex(); + return typeNameFromTypeInfo(mobj, mobj->d.data[paramsIndex + index]); +} + QList<QByteArray> QMetaMethodPrivate::parameterTypes() const { Q_ASSERT(priv(mobj->d.data)->revision >= 7); @@ -1961,6 +1968,20 @@ QList<QByteArray> QMetaMethod::parameterTypes() const } /*! + \since 6.0 + Returns the name of the type at position \a index + If there is no parameter at \a index, returns an empty QByteArray + + \sa parameterNames() + */ +QByteArray QMetaMethod::parameterTypeName(int index) const +{ + if (!mobj || index < 0 || index >= parameterCount()) + return {}; + return QMetaMethodPrivate::get(this)->parameterTypeName(index); +} + +/*! Returns a list of parameter names. \sa parameterTypes(), methodSignature() diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h index d013bfce65..8136e04dc9 100644 --- a/src/corelib/kernel/qmetaobject.h +++ b/src/corelib/kernel/qmetaobject.h @@ -63,6 +63,7 @@ public: QMetaType parameterMetaType(int index) const; void getParameterTypes(int *types) const; QList<QByteArray> parameterTypes() const; + QByteArray parameterTypeName(int index) const; QList<QByteArray> parameterNames() const; const char *tag() const; enum Access { Private, Protected, Public }; diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 1b8646947e..54229a9f71 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -95,28 +95,29 @@ QAbstractDynamicMetaObject::~QAbstractDynamicMetaObject() { } -static int *queuedConnectionTypes(const QList<QByteArray> &typeNames) +static int *queuedConnectionTypes(const QMetaMethod& method) { - int *types = new int [typeNames.count() + 1]; - Q_CHECK_PTR(types); - for (int i = 0; i < typeNames.count(); ++i) { - const QByteArray typeName = typeNames.at(i); - if (typeName.endsWith('*')) - types[i] = QMetaType::VoidStar; + const auto parameterCount = method.parameterCount(); + int *typeIds = new int [parameterCount + 1]; + Q_CHECK_PTR(typeIds); + for (int i = 0; i < parameterCount; ++i) { + const QMetaType metaType = method.parameterMetaType(i); + if (metaType.flags() & QMetaType::IsPointer) + typeIds[i] = QMetaType::VoidStar; else - types[i] = QMetaType::fromName(typeName).id(); - - if (!types[i]) { + typeIds[i] = metaType.id(); + if (!typeIds[i]) { + const QByteArray typeName = method.parameterTypeName(i); qWarning("QObject::connect: Cannot queue arguments of type '%s'\n" "(Make sure '%s' is registered using qRegisterMetaType().)", typeName.constData(), typeName.constData()); - delete [] types; + delete [] typeIds; return nullptr; } } - types[typeNames.count()] = 0; + typeIds[parameterCount] = 0; - return types; + return typeIds; } static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc) @@ -2871,7 +2872,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho int *types = nullptr; if ((type == Qt::QueuedConnection) - && !(types = queuedConnectionTypes(signal.parameterTypes()))) + && !(types = queuedConnectionTypes(signal))) return QMetaObject::Connection(nullptr); #ifndef QT_NO_DEBUG @@ -3615,7 +3616,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect const int *argumentTypes = c->argumentTypes.loadRelaxed(); if (!argumentTypes) { QMetaMethod m = QMetaObjectPrivate::signal(sender->metaObject(), signal); - argumentTypes = queuedConnectionTypes(m.parameterTypes()); + argumentTypes = queuedConnectionTypes(m); if (!argumentTypes) // cannot queue arguments argumentTypes = &DIRECT_CONNECTION_ONLY; if (!c->argumentTypes.testAndSetOrdered(nullptr, argumentTypes)) { |