diff options
Diffstat (limited to 'src/imports/statemachine/signaltransition.cpp')
-rw-r--r-- | src/imports/statemachine/signaltransition.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/imports/statemachine/signaltransition.cpp b/src/imports/statemachine/signaltransition.cpp index 4153c70fd0..2e6381fc08 100644 --- a/src/imports/statemachine/signaltransition.cpp +++ b/src/imports/statemachine/signaltransition.cpp @@ -78,8 +78,9 @@ bool SignalTransition::eventTest(QEvent *event) // Set arguments as context properties int count = e->arguments().count(); QMetaMethod metaMethod = e->sender()->metaObject()->method(e->signalIndex()); + const auto parameterNames = metaMethod.parameterNames(); for (int i = 0; i < count; i++) - context.setContextProperty(metaMethod.parameterNames()[i], QVariant::fromValue(e->arguments().at(i))); + context.setContextProperty(parameterNames[i], QVariant::fromValue(e->arguments().at(i))); QQmlExpression expr(m_guard, &context, this); QVariant result = expr.evaluate(); @@ -111,15 +112,27 @@ void SignalTransition::setSignal(const QJSValue &signal) QV4::ExecutionEngine *jsEngine = QV8Engine::getV4(QQmlEngine::contextForObject(this)->engine()); QV4::Scope scope(jsEngine); - QV4::Scoped<QV4::QObjectMethod> qobjectSignal(scope, QJSValuePrivate::convertedToValue(jsEngine, m_signal)); - Q_ASSERT(qobjectSignal); - - QObject *sender = qobjectSignal->object(); - Q_ASSERT(sender); - QMetaMethod metaMethod = sender->metaObject()->method(qobjectSignal->methodIndex()); + QObject *sender; + QMetaMethod signalMethod; + + QV4::ScopedValue value(scope, QJSValuePrivate::convertedToValue(jsEngine, m_signal)); + + // Did we get the "slot" that can be used to invoke the signal? + if (QV4::QObjectMethod *signalSlot = value->as<QV4::QObjectMethod>()) { + sender = signalSlot->object(); + Q_ASSERT(sender); + signalMethod = sender->metaObject()->method(signalSlot->methodIndex()); + } else if (QV4::QmlSignalHandler *signalObject = value->as<QV4::QmlSignalHandler>()) { // or did we get the signal object (the one with the connect()/disconnect() functions) ? + sender = signalObject->object(); + Q_ASSERT(sender); + signalMethod = sender->metaObject()->method(signalObject->signalIndex()); + } else { + qmlInfo(this) << tr("Specified signal does not exist."); + return; + } QSignalTransition::setSenderObject(sender); - QSignalTransition::setSignal(metaMethod.methodSignature()); + QSignalTransition::setSignal(signalMethod.methodSignature()); connectTriggered(); } @@ -178,7 +191,7 @@ void SignalTransitionParser::verifyBindings(const QV4::CompiledData::Unit *qmlUn QString propName = qmlUnit->stringAt(binding->propertyNameIndex); - if (propName != QStringLiteral("onTriggered")) { + if (propName != QLatin1String("onTriggered")) { error(props.at(ii), SignalTransition::tr("Cannot assign to non-existent property \"%1\"").arg(propName)); return; } |