Skip to content

Commit a539ce4

Browse files
Kent HansenKent Hansen
authored andcommitted
make signal handlers understand QVariant again
Also, issue a warning if a type is not known to the meta-type system. Backport of 508c9cd Task-number: QTBUG-5060
1 parent ee0690c commit a539ce4

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/script/qscriptextqobject.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,12 +1657,27 @@ void QScript::QObjectConnectionManager::execute(int slotIndex, void **argv)
16571657
activation_data->m_members[i].object(nameId, i,
16581658
QScriptValue::Undeletable
16591659
| QScriptValue::SkipInEnumeration);
1660+
QScriptValueImpl actual;
16601661
if (i < argc) {
1661-
int argType = QMetaType::type(parameterTypes.at(i));
1662-
activation_data->m_values[i] = eng->create(argType, argv[i + 1]);
1662+
void *arg = argv[i + 1];
1663+
QByteArray typeName = parameterTypes.at(i);
1664+
int argType = QMetaType::type(typeName);
1665+
if (!argType) {
1666+
if (typeName == "QVariant") {
1667+
actual = eng->valueFromVariant(*reinterpret_cast<QVariant*>(arg));
1668+
} else {
1669+
qWarning("QScriptEngine: Unable to handle unregistered datatype '%s' "
1670+
"when invoking handler of signal %s::%s",
1671+
typeName.constData(), meta->className(), method.signature());
1672+
actual = eng->undefinedValue();
1673+
}
1674+
} else {
1675+
actual = eng->create(argType, arg);
1676+
}
16631677
} else {
1664-
activation_data->m_values[i] = eng->undefinedValue();
1678+
actual = eng->undefinedValue();
16651679
}
1680+
activation_data->m_values[i] = actual;
16661681
}
16671682

16681683
QScriptValueImpl senderObject;

tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ class MyQObject : public QObject
326326
{ emit mySignalWithDefaultArg(arg); }
327327
void emitMySignalWithDefaultArg()
328328
{ emit mySignalWithDefaultArg(); }
329+
void emitMySignalWithVariantArg(const QVariant &arg)
330+
{ emit mySignalWithVariantArg(arg); }
331+
void emitMySignalWithScriptEngineArg(QScriptEngine *arg)
332+
{ emit mySignalWithScriptEngineArg(arg); }
329333

330334
public Q_SLOTS:
331335
void mySlot()
@@ -388,6 +392,8 @@ private Q_SLOTS:
388392
void myOtherOverloadedSignal(const QString &arg);
389393
void myOtherOverloadedSignal(int arg);
390394
void mySignalWithDefaultArg(int arg = 123);
395+
void mySignalWithVariantArg(const QVariant &arg);
396+
void mySignalWithScriptEngineArg(QScriptEngine *arg);
391397

392398
protected:
393399
void connectNotify(const char *signal) {
@@ -1501,6 +1507,29 @@ void tst_QScriptExtQObject::connectAndDisconnect()
15011507
m_myObject->emitMyOtherOverloadedSignal(123);
15021508
QVERIFY(!m_engine->evaluate("gotSignal").toBoolean());
15031509

1510+
// signal with QVariant arg: argument conversion should work
1511+
m_myObject->clearConnectedSignal();
1512+
QVERIFY(m_engine->evaluate("myObject.mySignalWithVariantArg.connect(myHandler)").isUndefined());
1513+
QCOMPARE(m_myObject->connectedSignal().constData(), SIGNAL(mySignalWithVariantArg(QVariant)));
1514+
m_engine->evaluate("gotSignal = false");
1515+
m_myObject->emitMySignalWithVariantArg(123);
1516+
QCOMPARE(m_engine->evaluate("gotSignal").toBoolean(), true);
1517+
QCOMPARE(m_engine->evaluate("signalArgs.length").toNumber(), 1.0);
1518+
QCOMPARE(m_engine->evaluate("signalArgs[0]").toNumber(), 123.0);
1519+
QVERIFY(m_engine->evaluate("myObject.mySignalWithVariantArg.disconnect(myHandler)").isUndefined());
1520+
1521+
// signal with argument type that's unknown to the meta-type system
1522+
m_myObject->clearConnectedSignal();
1523+
QVERIFY(m_engine->evaluate("myObject.mySignalWithScriptEngineArg.connect(myHandler)").isUndefined());
1524+
QCOMPARE(m_myObject->connectedSignal().constData(), SIGNAL(mySignalWithScriptEngineArg(QScriptEngine*)));
1525+
m_engine->evaluate("gotSignal = false");
1526+
QTest::ignoreMessage(QtWarningMsg, "QScriptEngine: Unable to handle unregistered datatype 'QScriptEngine*' when invoking handler of signal MyQObject::mySignalWithScriptEngineArg(QScriptEngine*)");
1527+
m_myObject->emitMySignalWithScriptEngineArg(m_engine);
1528+
QCOMPARE(m_engine->evaluate("gotSignal").toBoolean(), true);
1529+
QCOMPARE(m_engine->evaluate("signalArgs.length").toNumber(), 1.0);
1530+
QVERIFY(m_engine->evaluate("signalArgs[0]").isUndefined());
1531+
QVERIFY(m_engine->evaluate("myObject.mySignalWithScriptEngineArg.disconnect(myHandler)").isUndefined());
1532+
15041533
// connect(object, function)
15051534
m_engine->evaluate("otherObject = { name:'foo' }");
15061535
QVERIFY(m_engine->evaluate("myObject.mySignal.connect(otherObject, myHandler)").isUndefined());

0 commit comments

Comments
 (0)