summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-11-26 12:56:31 +0100
committerLiang Qi <liang.qi@qt.io>2016-11-26 12:56:32 +0100
commit8cc9153f413c36d505794adfaca4f4724692fa81 (patch)
tree02eb0a3d2b9c44b8f0d4139e8e9fa3e58b7338e7 /src
parentbf66a8531e0ada3ade7e873bc3fae824237acd3e (diff)
parentc3787add37a77efe18e78549e51ff904f07a75f0 (diff)
downloadqtwebchannel-8cc9153f413c36d505794adfaca4f4724692fa81.tar.gz
Merge remote-tracking branch 'origin/5.7' into 5.8
Change-Id: I09a494a9b94ce169d60e77f4bffa8845db01293a
Diffstat (limited to 'src')
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp24
-rw-r--r--src/webchannel/signalhandler_p.h2
2 files changed, 15 insertions, 11 deletions
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp
index 66676f0..148404d 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;