// ----------------------------------------------- // Minimal compilable example // // Qt5 result: all methods called // Qt6 result: only testMethod4 is called // ----------------------------------------------- #include #include #include "main.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); #if (QT_VERSION >= QT_VERSION_CHECK(6,0,0)) auto q1 = QMetaType::fromName("QList"); auto q2 = QMetaType::fromName("QList"); #else auto q1 = QMetaType(QMetaType::type("QList")); auto q2 = QMetaType(QMetaType::type("QList")); #endif qDebug() << "QList" << q1.id(); qDebug() << "QList" << q2.id(); // Qt5: need to register it // Qt6: registering as a type has no effect? qRegisterMetaType>("QList"); // QVariant converts QList to QList auto l1 = (int)11; auto l2 = QList() << 11; auto l3 = QList() << 11; auto v1 = QVariant::fromValue(l1); auto v2 = QVariant::fromValue(l2); auto v3 = QVariant::fromValue(l3); qDebug() << "v1 type:" << v1.typeName(); qDebug() << "v2 type:" << v2.typeName(); qDebug() << "v3 type:" << v3.typeName(); // Issue: Invoke tries to find QList and does not accept QList // Not all methods are called #if (QT_VERSION >= QT_VERSION_CHECK(6,0,0)) qRegisterMetaType("InvokeTarget"); auto mt = QMetaType::fromName("InvokeTarget"); auto obj = qobject_cast((QObject*)mt.create()); #else qRegisterMetaType("InvokeTarget"); auto mt = QMetaType(QMetaType::type("InvokeTarget")); const QMetaObject* metaObject = QMetaType::metaObjectForType(mt.id()); auto obj = metaObject->newInstance(); #endif if (obj == nullptr) return -1; // reconstruct variables to argument list auto genArg1 = QGenericArgument(QMetaType::typeName(v1.userType()), const_cast(v1.constData())); auto genArg2 = QGenericArgument(QMetaType::typeName(v2.userType()), const_cast(v2.constData())); QMetaObject::invokeMethod(obj, "testMethod1", genArg1, genArg2); QMetaObject::invokeMethod(obj, "testMethod2", genArg1, genArg2); QMetaObject::invokeMethod(obj, "testMethod3", genArg1, genArg2); QMetaObject::invokeMethod(obj, "testMethod4", genArg1, genArg2); return 0; }