From e5e8b785cc20c22291b6657093965cc0735597f5 Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Fri, 20 Oct 2023 17:36:01 +0200 Subject: [PATCH] QtDBus: Use explicitly meta type name instead of method type In Qt 6, QMetaType sees the underlying type the compiler knows, so a "using VariantMapMap = QMap" typedef will fail to match a signature of VariantMapMap to QMap<...> because qDBusParametersForMethod looks for the method type name whose QMetaType::fromName lookup will fail later. Pick-to: 6.5 Change-Id: I142dc42ca86aa8a96f73424ec5da5780f2c1e6a3 Reviewed-by: Thiago Macieira (cherry picked from commit a668ed44dc98a377a5253410d65fe4b3667e87e6) Reviewed-by: Qt Cherry-pick Bot --- src/dbus/qdbusmisc.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index 502624cd666..719450c3dd8 100644 --- a/src/dbus/qdbusmisc.cpp +++ b/src/dbus/qdbusmisc.cpp @@ -103,7 +103,19 @@ bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name) // sig must be the normalised signature for the method int qDBusParametersForMethod(const QMetaMethod &mm, QList &metaTypes, QString &errorMsg) { - return qDBusParametersForMethod(mm.parameterTypes(), metaTypes, errorMsg); + QList parameterTypes; + parameterTypes.reserve(mm.parameterCount()); + + // Not using QMetaMethod::parameterTypes() since we call QMetaType::fromName below + // where we need any typedefs resolved already. + for (int i = 0; i < mm.parameterCount(); ++i) { + QByteArray typeName = mm.parameterMetaType(i).name(); + if (typeName.isEmpty()) + typeName = mm.parameterTypeName(i); + parameterTypes.append(typeName); + } + + return qDBusParametersForMethod(parameterTypes, metaTypes, errorMsg); } #endif // QT_BOOTSTRAPPED