diff options
8 files changed, 51 insertions, 0 deletions
diff --git a/tests/auto/integration_multiprocess/ExtPodInterface.rep b/tests/auto/integration_multiprocess/ExtPodInterface.rep new file mode 100644 index 0000000..0c9ad56 --- /dev/null +++ b/tests/auto/integration_multiprocess/ExtPodInterface.rep @@ -0,0 +1 @@ +POD ExtPOD(int i, float f, QString s) diff --git a/tests/auto/integration_multiprocess/MyInterface.rep b/tests/auto/integration_multiprocess/MyInterface.rep index a10dbcf..5101529 100644 --- a/tests/auto/integration_multiprocess/MyInterface.rep +++ b/tests/auto/integration_multiprocess/MyInterface.rep @@ -1,4 +1,5 @@ #include <QtCore> +#include "rep_ExtPodInterface_merged.h" class MyInterface { @@ -15,4 +16,7 @@ class MyInterface SIGNAL(advance()) SIGNAL(testEnumParamsInSignals(Enum1 enumSignalParam, bool signalParam2, QString)) + + SLOT(void testExtPODListSlot(const QList<ExtPOD> &)) + SIGNAL(testExtPODListSignal(const QList<ExtPOD> &)) }; diff --git a/tests/auto/integration_multiprocess/client/CMakeLists.txt b/tests/auto/integration_multiprocess/client/CMakeLists.txt index 4ea8af0..88fdb34 100644 --- a/tests/auto/integration_multiprocess/client/CMakeLists.txt +++ b/tests/auto/integration_multiprocess/client/CMakeLists.txt @@ -13,6 +13,11 @@ qt_internal_add_executable(integration_multiprocess_client Qt::RemoteObjects Qt::Test ) + +qt6_add_repc_merged(integration_multiprocess_client + ../ExtPodInterface.rep +) + qt6_add_repc_replicas(integration_multiprocess_client ../MyInterface.rep ) diff --git a/tests/auto/integration_multiprocess/client/main.cpp b/tests/auto/integration_multiprocess/client/main.cpp index 979c3d5..e07cefc 100644 --- a/tests/auto/integration_multiprocess/client/main.cpp +++ b/tests/auto/integration_multiprocess/client/main.cpp @@ -27,6 +27,7 @@ ****************************************************************************/ #include "rep_MyInterface_replica.h" +#include "rep_ExtPodInterface_merged.h" #include <QCoreApplication> #include <QtRemoteObjects/qremoteobjectnode.h> @@ -159,6 +160,21 @@ private Q_SLOTS: QTRY_COMPARE(rep->started(), false); } + void testExtPodListSignals() + { + QScopedPointer<MyInterfaceReplica> rep(new MyInterfaceReplica()); + rep->setNode(m_repNode.get()); + QVERIFY(rep->waitForSource()); + + auto list = QList { ExtPOD(1, 1.1f, QStringLiteral("v1")), + ExtPOD(2, 2.2f, QStringLiteral("v2")) }; + rep->testExtPODListSlot(list); + QSignalSpy spy(rep.data(), &MyInterfaceReplica::testExtPODListSignal); + connect(rep.data(), &MyInterfaceReplica::testExtPODListSignal, + [list](const QList<ExtPOD> &l) { QCOMPARE(l, list); }); + QTRY_COMPARE(spy.count(), 1); + } + void testPod() { QScopedPointer<QRemoteObjectDynamicReplica> podRep(m_repNode->acquireDynamic("PodInterface")); diff --git a/tests/auto/integration_multiprocess/server/CMakeLists.txt b/tests/auto/integration_multiprocess/server/CMakeLists.txt index bb5a9f0..3ed2421 100644 --- a/tests/auto/integration_multiprocess/server/CMakeLists.txt +++ b/tests/auto/integration_multiprocess/server/CMakeLists.txt @@ -14,6 +14,10 @@ qt_internal_add_executable(integration_multiprocess_server Qt::RemoteObjects Qt::Test ) +qt6_add_repc_merged(integration_multiprocess_server + ../ExtPodInterface.rep +) + qt6_add_repc_sources(integration_multiprocess_server ../MyInterface.rep ../PodInterface.rep diff --git a/tests/auto/integration_multiprocess/server/mytestserver.cpp b/tests/auto/integration_multiprocess/server/mytestserver.cpp index c97a13a..500a6fe 100644 --- a/tests/auto/integration_multiprocess/server/mytestserver.cpp +++ b/tests/auto/integration_multiprocess/server/mytestserver.cpp @@ -67,3 +67,8 @@ void MyTestServer::testEnumParamsInSlots(Enum1 enumSlotParam, bool slotParam2, i setStarted(slotParam2); emit testEnumParamsInSignals(enum1(), started(), QString::number(number)); } + +void MyTestServer::testExtPODListSlot(const QList<ExtPOD> &l) +{ + emit testExtPODListSignal(l); +} diff --git a/tests/auto/integration_multiprocess/server/mytestserver.h b/tests/auto/integration_multiprocess/server/mytestserver.h index cbdd1c0..9bc47ae 100644 --- a/tests/auto/integration_multiprocess/server/mytestserver.h +++ b/tests/auto/integration_multiprocess/server/mytestserver.h @@ -49,6 +49,7 @@ public Q_SLOTS: bool stop() override; bool quit() override; void testEnumParamsInSlots(Enum1 enumSlotParam, bool slotParam2, int __repc_variable_1) override; + void testExtPODListSlot(const QList<ExtPOD> &l) override; Q_SIGNALS: void quitApp(); diff --git a/tools/repc/repcodegenerator.cpp b/tools/repc/repcodegenerator.cpp index 175ac43..e3b9ad3 100644 --- a/tools/repc/repcodegenerator.cpp +++ b/tools/repc/repcodegenerator.cpp @@ -205,6 +205,21 @@ void RepCodeGenerator::generate(Mode mode, QString fileName) pendingMetaTypes << function.returnType; for (const ASTDeclaration &decl : function.params) { classMetaTypes << decl.type; + + // Collect types packaged by Qt containers, to register their metatypes if needed + QRegularExpression re( + QStringLiteral("(QList|QMap|QHash)<\\s*([\\w]+)\\s*(,\\s*([\\w]+))?\\s*>")); + QRegularExpressionMatch m = re.match(decl.type); + if (m.hasMatch()) { + if (auto captured = m.captured(2); + !captured.isNull() && !metaTypes.contains(captured)) { + classMetaTypes << captured; + } + if (auto captured = m.captured(4); + !captured.isNull() && !metaTypes.contains(captured)) { + classMetaTypes << captured; + } + } } }; for (const ASTFunction &function : astClass.signalsList) |