zoukankan      html  css  js  c++  java
  • 利用QObject反射实现jsonrpc

    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 &params)
        {
            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());
  • 相关阅读:
    第一阶段冲刺05
    生成器
    三元表达式 ,列表推导式 , 字典生成式
    装饰器
    闭包函数
    函数的定义和参数
    列表内置方法
    字符串的内置方法
    py_11_ 0731
    py_11_ 0730
  • 原文地址:https://www.cnblogs.com/danju/p/4861538.html
Copyright © 2011-2022 走看看