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());
  • 相关阅读:
    ElasticSearch 2 (10)
    zookeeper 配置
    zookeeper
    ES 聚合函数
    win 7安装 linux
    Elasticsearch分布式搜索集群配置
    Elasticsearch 插件安装
    为Elasticsearch添加中文分词,对比分词器效果
    .net 4.0 网站发布(转)
    ssm 网页
  • 原文地址:https://www.cnblogs.com/danju/p/4861538.html
Copyright © 2011-2022 走看看