The params array in the 1.JSONRPC request generates a signature
Static QString Signaturefromjsonarray (const Qjsonarray &Array) { qstringlist list; foreach (const Qjsonvalue &V, array) { list<<jstypetostring (V.type ()); } return list.join (","); }
A method within a 2.QObject object generates a signature
Static QString Signaturefrommethod (const Qmetamethod &method) { qstringlist list; for (int i=0; I<method.parametercount (); i++) { int type = Method.parametertype (i); List<<jstypetostring (Convertvarianttypetojstype (type)); } return list.join (","); }
3. Find the signature in the Qobject instance (slightly), the same is called
StaticQvariantlist Createparametervariantlist (ConstQmetamethod &method,ConstQjsonarray &Array) {qvariantlist varlist; for(intI=0; I<method.parametercount (); i++) { intType =Method.parametertype (i); Qvariant v=convertjsvaluetovariant (Type, array.at (i)); Varlist.append (v); } returnvarlist; } StaticQvariant Invoke (qobject*Object,ConstQmetamethod &method,ConstQjsonarray ¶ms) {Qvarlengtharray<void*,Ten>Invokeparams; //Press-In return value, parameter intReturnType =Method.returntype (); if(returntype==qmetatype::void) {ReturnType=Qmetatype::unknowntype; } qvariant returnvalue (ReturnType, nullptr); Invokeparams.append (Returnvalue.data ()); //Press-In ParametersQvariantlist varlist = Createparametervariantlist (method,params); foreach(ConstQvariant &V, varlist) {Invokeparams.append (const_cast<void*>(V.constdata ())); } //called Object-Qt_metacall (Qmetaobject::invokemetamethod, Method.methodindex (), Invokeparams.data ()); returnreturnvalue; }Key line of code:
object->qt_metacall (Qmetaobject::invokemetamethod, Method.methodindex (), Invokeparams.data ());
Using Qobject reflection to achieve JSONRPC