diff options
author | Liang Qi <liang.qi@qt.io> | 2016-10-01 21:58:13 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-10-01 21:58:13 +0200 |
commit | 2d29a774dd165ee2acd0b607b7e0d02a37c5fea5 (patch) | |
tree | be24afec9f39c584abff83888e842c25abbbddbb /src | |
parent | d342edcc22d3c9c0299e86805d93e7031507345b (diff) | |
parent | 7cb2d467c3421eced44ae7b887b8738cc68595fc (diff) | |
download | qtwebchannel-2d29a774dd165ee2acd0b607b7e0d02a37c5fea5.tar.gz |
Merge remote-tracking branch 'origin/5.6' into 5.7
Change-Id: Ib8b5300d27583018bc7582be41140dfda0ab5309
Diffstat (limited to 'src')
-rw-r--r-- | src/webchannel/qmetaobjectpublisher.cpp | 24 | ||||
-rw-r--r-- | src/webchannel/signalhandler_p.h | 2 |
2 files changed, 15 insertions, 11 deletions
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp index d796d1e..b4747d4 100644 --- a/src/webchannel/qmetaobjectpublisher.cpp +++ b/src/webchannel/qmetaobjectpublisher.cpp @@ -374,22 +374,26 @@ QVariant QMetaObjectPublisher::invokeMethod(QObject *const object, const int met for (int i = 0; i < qMin(args.size(), method.parameterCount()); ++i) { arguments[i].value = toVariant(args.at(i), method.parameterType(i)); } - // construct QGenericReturnArgument QVariant returnValue; - if (method.returnType() != qMetaTypeId<QVariant>() && method.returnType() != qMetaTypeId<void>()) { + if (method.returnType() == QMetaType::Void) { + // Skip return for void methods (prevents runtime warnings inside Qt), and allows + // QMetaMethod to invoke void-returning methods on QObjects in a different thread. + method.invoke(object, + arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], + arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]); + } else { + QGenericReturnArgument returnArgument(method.typeName(), returnValue.data()); + // Only init variant with return type if its not a variant itself, which would // lead to nested variants which is not what we want. - // Also, skip void-return types for obvious reasons (and to prevent a runtime warning inside Qt). - returnValue = QVariant(method.returnType(), 0); - } - QGenericReturnArgument returnArgument(method.typeName(), returnValue.data()); - - // now we can call the method - method.invoke(object, returnArgument, + if (method.returnType() != QMetaType::QVariant) + returnValue = QVariant(method.returnType(), 0); + method.invoke(object, returnArgument, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]); - + } + // now we can call the method return returnValue; } diff --git a/src/webchannel/signalhandler_p.h b/src/webchannel/signalhandler_p.h index b6c316b..9bcb071 100644 --- a/src/webchannel/signalhandler_p.h +++ b/src/webchannel/signalhandler_p.h @@ -184,7 +184,7 @@ void SignalHandler<Receiver>::connectTo(const QObject *object, const int signalI } // otherwise not yet connected, do so now static const int memberOffset = QObject::staticMetaObject.methodCount(); - QMetaObject::Connection connection = QMetaObject::connect(object, signal.methodIndex(), this, memberOffset + signalIndex, Qt::DirectConnection, 0); + QMetaObject::Connection connection = QMetaObject::connect(object, signal.methodIndex(), this, memberOffset + signalIndex, Qt::AutoConnection, 0); if (!connection) { qWarning() << "SignalHandler: QMetaObject::connect returned false. Unable to connect to" << object << signal.name() << signal.methodSignature(); return; |