int main(int argc, char *argv[]) { try { qlua::LuaContext ctx; TestObject myobj; myobj.setObjectName( "MyObject" ); //only add a single method to the Lua table ctx.AddQObject( &myobj, "myobj", false, qlua::LuaContext::QOBJ_NO_DELETE, qlua::LuaDefaultSignatureMapper(), QStringList() << "emitSignal" ); ctx.Eval( "qlua.connect( myobj, 'aSignal(QString)', " "function(msg) print( 'Lua callback called with data: ' .. msg ); end );" "print( 'object name: ' .. myobj.objectName );" "qlua.connect( myobj, 'aSignal(QString)', myobj, 'aSlot(QString)' );" "myobj.emitSignal('hello')" ); TestObject* myobj2 = new TestObject; QPointer< TestObject > pMyObject2 = myobj2; myobj2->setObjectName( "MyObject2" ); ctx.AddQObject( myobj2, "myobj2", false, qlua::LuaContext::QOBJ_IMMEDIATE_DELETE ); ctx.Eval( "print( 'object 2 name: '..myobj2.objectName )" ); ctx.Eval( "myobj2=nil;collectgarbage('collect')"); if( pMyObject2.isNull() ) std::cout << "Object 2 garbage collected by Lua" << std::endl; else std::cerr << "Object 2 not garbage collected!" << std::endl; TestObject myobj3; ctx.AddQObject( &myobj3, "myobj3", false, qlua::LuaContext::QOBJ_NO_DELETE ); ctx.Eval( "print( myobj3.copyString( 'hi' ) );" "vm = myobj3.copyVariantMap( {key1=1,key2='hello'} );" "print( vm['key1'] .. ' ' .. vm['key2'] );" "print( myobj3.createObject().objectName );" ); ctx.Eval( "fl = myobj3.copyShortList( {1,2,3} );\n" "print( fl[1] .. ' ' .. fl[ 3 ] );\n" ); } catch( const std::exception& e ) { std::cerr << e.what() << std::endl; } return 0; }
void TestWebChannel::testDeregisterObjects() { QWebChannel channel; TestObject testObject; testObject.setObjectName("myTestObject"); channel.registerObject(testObject.objectName(), &testObject); channel.connectTo(m_dummyTransport); channel.d_func()->publisher->initializeClient(m_dummyTransport); QJsonObject connectMessage = QJsonDocument::fromJson(("{\"type\": 7," "\"object\": \"myTestObject\"," "\"signal\": " + QString::number(testObject.metaObject()->indexOfSignal("sig1()")) + "}").toLatin1()).object(); channel.d_func()->publisher->handleMessage(connectMessage, m_dummyTransport); emit testObject.sig1(); channel.deregisterObject(&testObject); emit testObject.sig1(); }
void TestWebChannel::testInfoForObject() { TestObject obj; obj.setObjectName("myTestObject"); QWebChannel channel; const QJsonObject info = channel.d_func()->publisher->classInfoForObject(&obj, m_dummyTransport); QCOMPARE(info.keys(), QStringList() << "enums" << "methods" << "properties" << "signals"); { // enums QJsonObject fooEnum; fooEnum["Asdf"] = TestObject::Asdf; fooEnum["Bar"] = TestObject::Bar; QJsonObject expected; expected["Foo"] = fooEnum; QCOMPARE(info["enums"].toObject(), expected); } { // methods & slots QJsonArray expected; { QJsonArray method; method.append(QStringLiteral("deleteLater")); method.append(obj.metaObject()->indexOfMethod("deleteLater()")); expected.append(method); } { QJsonArray method; method.append(QStringLiteral("slot1")); method.append(obj.metaObject()->indexOfMethod("slot1()")); expected.append(method); } { QJsonArray method; method.append(QStringLiteral("slot2")); method.append(obj.metaObject()->indexOfMethod("slot2(QString)")); expected.append(method); } { QJsonArray method; method.append(QStringLiteral("method1")); method.append(obj.metaObject()->indexOfMethod("method1()")); expected.append(method); } QCOMPARE(info["methods"].toArray(), expected); } { // signals QJsonArray expected; { QJsonArray signal; signal.append(QStringLiteral("destroyed")); signal.append(obj.metaObject()->indexOfMethod("destroyed(QObject*)")); expected.append(signal); } { QJsonArray signal; signal.append(QStringLiteral("sig1")); signal.append(obj.metaObject()->indexOfMethod("sig1()")); expected.append(signal); } { QJsonArray signal; signal.append(QStringLiteral("sig2")); signal.append(obj.metaObject()->indexOfMethod("sig2(QString)")); expected.append(signal); } QCOMPARE(info["signals"].toArray(), expected); } { // properties QJsonArray expected; { QJsonArray property; property.append(obj.metaObject()->indexOfProperty("objectName")); property.append(QStringLiteral("objectName")); { QJsonArray signal; signal.append(1); signal.append(obj.metaObject()->indexOfMethod("objectNameChanged(QString)")); property.append(signal); } property.append(obj.objectName()); expected.append(property); } { QJsonArray property; property.append(obj.metaObject()->indexOfProperty("foo")); property.append(QStringLiteral("foo")); { QJsonArray signal; property.append(signal); } property.append(obj.foo()); expected.append(property); } { QJsonArray property; property.append(obj.metaObject()->indexOfProperty("asdf")); property.append(QStringLiteral("asdf")); { QJsonArray signal; signal.append(1); signal.append(obj.metaObject()->indexOfMethod("asdfChanged()")); property.append(signal); } property.append(obj.asdf()); expected.append(property); } { QJsonArray property; property.append(obj.metaObject()->indexOfProperty("bar")); property.append(QStringLiteral("bar")); { QJsonArray signal; signal.append(QStringLiteral("theBarHasChanged")); signal.append(obj.metaObject()->indexOfMethod("theBarHasChanged()")); property.append(signal); } property.append(obj.bar()); expected.append(property); } QCOMPARE(info["properties"].toArray(), expected); } }