1.jsonrpc请求中的params数组生成签名
static QString signatureFromJsonArray(const QJsonArray &array) { QStringList list; foreach(const QJsonValue &v, array) { list<<JSTypeToString(v.type()); } return list.join(","); }
2.QObject对象内的方法生成签名
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.查找QObject实例中的签名(略),相同则调用
static QVariantList createParameterVariantList(const QMetaMethod &method, const QJsonArray &array) { QVariantList varList; for(int i=0; i<method.parameterCount(); i++) { int type = method.parameterType(i); QVariant v= convertJSValueToVariant(type, array.at(i)); varList.append(v); } return varList; } static QVariant invoke(QObject* object, const QMetaMethod &method, const QJsonArray ¶ms) { QVarLengthArray<void *, 10> invokeParams; //压入返回值,参数 int returnType = method.returnType(); if (returnType==QMetaType::Void) { returnType = QMetaType::UnknownType; } QVariant returnValue(returnType, nullptr); invokeParams.append(returnValue.data()); //压入参数 QVariantList varList = createParameterVariantList(method, params); foreach(const QVariant &v, varList) { invokeParams.append(const_cast<void *>(v.constData())); } //调用 object->qt_metacall(QMetaObject::InvokeMetaMethod, method.methodIndex(), invokeParams.data()); return returnValue; }
关键代码行:object->qt_metacall(QMetaObject::InvokeMetaMethod, method.methodIndex(), invokeParams.data());