zoukankan      html  css  js  c++  java
  • QT自定义对象导入JavaScript脚本使用

    1、对象

      项目属性要添加

    QT       +=  script
    自定义的对象头文件如下,实现正常就好,记得脚本里要调用的方法一定要定义在
    public slots:下,要不然调用时提示该对象没有*方法
     
      1 #ifndef CMU_H
      2 #define CMU_H
      3 #include "Communication/Communication.h"
      4 #include "stt_basic_moudle.h"
      5 #include <iostream>
      6 #include <map>
      7 using namespace std;
      8 
      9 
     10 struct CMU_INFO
     11 {
     12     ///
     13     /// rief CMU_Table
     14     ///  name
     15     ///
     16     std::map<std::string, CCommunication*> name_commu;
     17     ///
     18     /// rief anonymous_commu
     19     ///
     20     CCommunication* anonymous_commu;
     21 };
     22 
     23 ///
     24 /// rief CMU_Table
     25 ///
     26 extern std::map<int,CMU_INFO> CMU_Table;
     27 
     28 class CMU:public QObject
     29 {
     30     Q_OBJECT
     31 
     32 public slots:
     33 
     34 #define D_CONNECT ("
     35 #########################################################
    
     36 # 函数说明:
    
     37 #   打开并连接通讯 目前支持 telnet、console、系统命令行  
    
     38 #   
    
     39 # 参数说明:
    
     40 #   arg1: 连接模式[telnet;console,cmd] ----------必选参数
    
     41 #   arg2: 是否使用配置登陆,0默认登陆,1不登陆 [0;1]---可选
    
     42 #   arg3: 匿名通讯会自动关闭,给当前通讯命名[任意名字]   
    
     43 #   arg4: 无                                             
    
     44 #   arg5: 无                                             
    
     45 #   arg6: 无                                             
    
     46 #  示例:                                                 
    
     47 #    connect = telnet , 0 , cpe_telnet                   
    
     48 #                                                        
    
     49 #########################################################")
     50     bool connect (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
     51 
     52 
     53 #define D_CLOSE ("
     54 #########################################################
    
     55 # 函数说明:
    
     56 #   关闭通讯 目前支持 telnet、console、系统命令行  
    
     57 #   
    
     58 # 参数说明:
    
     59 #   arg1: 连接模式[telnet;console,cmd] ----------必选参数
    
     60 #   arg2: 匿名通讯会自动关闭,关闭通讯命名[任意名字] ---可选
    
     61 #  示例:                                                 
    
     62 #    connect = telnet ,  cpe_telnet                   
    
     63 #                                                        
    
     64 #########################################################")
     65     bool close (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
     66 
     67 
     68 #define D_SEND ("
     69 #########################################################
    
     70 # 函数说明:
    
     71 #   发送命令到通讯 目前支持 telnet、console、系统命令行  
    
     72 #   
    
     73 # 参数说明:
    
     74 #   arg1: 发送的命令 ----------必选参数
    
     75 #   arg2: 发送目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选
    
     76 #  示例:                                                 
    
     77 #    send = dir ,  cpe_telnet                   
    
     78 #                                                        
    
     79 #########################################################")
     80     bool send (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
     81 
     82 
     83 #define D_RECEIVE ("
     84 #########################################################
    
     85 # 函数说明:
    
     86 #   发送命令到通讯 目前支持 telnet、console、系统命令行  
    
     87 #   
    
     88 # 参数说明:
    
     89 #   arg1: 延时时间 ----------必选参数
    
     90 #   arg2: 为正则表达式 ----------必选参数
    
     91 #   arg3: 需要查找的值在正则表达式的第几组内 ----------必选参数
    
     92 #   arg4: 获取的结果保存到变量,默认RECEIVE ----------可选参数
    
     93 #   arg5: 发送目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选
    
     94 #  示例:                                                 
    
     95 #    receive = 2000,Mac.Address.{2}(.*).,1,para                  
    
     96 #                                                        
    
     97 #########################################################")
     98     bool receive(int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
     99 
    100 
    101 
    102 #define D_PING ("
    103 #########################################################
    
    104 # 函数说明:
    
    105 #   ping  
    
    106 #   
    
    107 # 参数说明:
    
    108 #   arg1: 目标IP ----------必选参数
    
    109 #   arg2: 源IP  [使用默认路由设置] ----------可选参数
    
    110 #   arg3: PING包的次数 默认4 ----------可选参数
    
    111 #   arg4: PING通的连续成功次数,默认1 ----------可选参数
    
    112 #   arg5: PING包的大小 默认64 ---可选
    
    113 #  示例:                                                 
    
    114 #   ping = %ip%,,60,3,64                  
    
    115 #                                                        
    
    116 #########################################################")
    117     bool ping (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    118 
    119 #define D_SLEEP ("
    120 #########################################################
    
    121 # 函数说明:
    
    122 #   示设置延时的时间  
    
    123 #   
    
    124 # 参数说明:
    
    125 #   arg1: 延时时间,时间单位为毫秒 ----------必选参数
    
    126 #  示例:                                                 
    
    127 #   sleep = 2000                 
    
    128 #                                                        
    
    129 #########################################################")
    130     bool sleep (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    131 
    132 #define D_FIND ("
    133 #########################################################
    
    134 # 函数说明:
    
    135 #   查找通讯返回信息相应的值  
    
    136 #   
    
    137 # 参数说明:
    
    138 #   arg1: 延时时间,时间单位为毫秒 ----------必选参数
    
    139 #   arg2: 要查找得值 ----------必选参数
    
    140 #   arg3: 发送目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选
    
    141 #  示例:                                                 
    
    142 #   find = 3000,succee                 
    
    143 #                                                        
    
    144 #########################################################")
    145     bool find (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    146 
    147 
    148 
    149 #define D_LOOPCHK ("
    150 #########################################################
    
    151 # 函数说明:
    
    152 #   在一定的时间内下一串指令然后通过正则表达式查找是否有返回所需要的值  
    
    153 #   
    
    154 # 参数说明:
    
    155 #   arg1: 发送的指令 ----------必选参数
    
    156 #   arg2: 总时间        ----------必选参数
    
    157 #   arg3: 正则表达式 ----------必选参数
    
    158 #   arg4: 需要查找的值在正则表达式的第几组内 ----------必选参数
    
    159 #   arg5: 发送完指令后等待时间 默认0----------可选参数
    
    160 #   arg6: 获取的结果保存到变量,默认RECEIVE ----------可选参数
    
    161 #   arg7: 目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选
    
    162 #  示例:                                                 
    
    163 #    loopchk = adsl info,5000,Path.*Dd.*D(d*)DKbps.*Downstream,1,1                  
    
    164 #                                                        
    
    165 #########################################################")
    166     bool loopchk(int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    167 
    168 #define D_CHECK ("
    169 #########################################################
    
    170 # 函数说明:
    
    171 #   如果需要比较相同,则使用一个参数,如果需要比较范围,则需要使用两个参数,用来表示上下限  
    
    172 #   
    
    173 # 参数说明:
    
    174 #   arg1: 比较值1   为数值择是上线                    ----------必选参数
    
    175 #   arg2: 比较值2  不为空则是数值范围比较下线 ----------可选参数
    
    176 #   arg3: 目标变量,默认RECEIVE                       ----------可选参数
    
    177 #  示例:                                                 
    
    178 #    check = %up_rate%,%down_rate%                   
    
    179 #                                                        
    
    180 #########################################################")
    181     bool check (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    182 
    183 
    184 #define D_SET ("
    185 #########################################################
    
    186 # 函数说明:
    
    187 #   用来将receive指令通过正则表达匹配到的值保存一个变量里  
    
    188 #   如果有四个参数:set = 新变量名,变量名,分隔符类型(数字),分隔数量  
    
    189 #   分隔符类型有:0->无,1->:,2->-,3->.,4->%3A,5->空格,6->空格  
    
    190 #   
    
    191 # 参数说明:
    
    192 #   arg1: 目标变量名                                                 ----------必选参数
    
    193 #   arg2: 源数据                                                        ----------可选参数
    
    194 #   arg3: 分隔符类型 0->无,1->:,2->-,3->.,4->%3A,5->空格,6->空格(除了空格,数据会变成十六进制)----------可选参数
    
    195 #   arg4: 分隔数量                                                     ----------可选参数
    
    196 #  示例:                                                 
    
    197 #    set = newmac,%mac%,1,2                 
    
    198 #                                                        
    
    199 #########################################################")
    200     bool set (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    201 
    202 #define D_STRINGADD ("
    203 #########################################################
    
    204 # 函数说明:
    
    205 #   根据具体截取数值确定累积参数增加  
    
    206 #   
    
    207 # 参数说明:
    
    208 #   arg1: 目的截取后的数值字符串                             ----------必选参数
    
    209 #   arg2: stringAdd指令所用到参数的个数(包含本身) ----------必选参数
    
    210 #   arg3: 前缀字符串                                                 ----------必选参数
    
    211 #   arg4: 括号内的第一个参数表示被截取的字符串,第二个参数表示起始位,第三个参数表示位数长度 ----------必选参数
    
    212 #   arg..:   同[arg4] 
    
    213 #  示例:                                                 
    
    214 #    stringAdd = %StrNew%,4,Str(WLAN_),Sub(&mac&;9;4)                 
    
    215 #                                                        
    
    216 #########################################################")
    217     bool stringAdd (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    218 
    219 
    220 #define D_COMPARE ("
    221 #########################################################
    
    222 # 函数说明:
    
    223 #   表示用于目的字符串的值与源字符串的值进行对比  
    
    224 #   
    
    225 # 参数说明:
    
    226 #   arg1: 目的字符串的值                             ----------必选参数
    
    227 #   arg2: 是源字符串的值                             ----------必选参数
    
    228 #   arg3: 第一个参数截取子字符串的索引号  ----------可选参数
    
    229 #   arg4: 截取子字符串的长度                      ----------可选参数
    
    230 #  示例:                                                 
    
    231 #    compare = %StrNew%,%ssid%,2,3                 
    
    232 #                                                        
    
    233 #########################################################")
    234     bool compare (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    235 
    236 
    237 #define D_ADD ("
    238 #########################################################
    
    239 # 函数说明:
    
    240 #   将源字符串的内容加/减一个数,然后按指定格式保存到目的字符串的变 
    
    241 #   量里  
    
    242 #   
    
    243 # 参数说明:
    
    244 #   arg1: 目的字符串的值                                  ----------必选参数
    
    245 #   arg2: 是源字符串的值                                  ----------必选参数
    
    246 #   arg3: 被加/减数[整数]:表示要减或加的参数   ----------必选参数
    
    247 #   arg4: 目的字符串格式[整数]:参数表示指定的间隔符(0:无,1: ":",2: "-",3: ".",4: "%3A",5:" ")----------必选参数
    
    248 #   arg5: 目的串截取段[整数]:间隔符之间的字符数   ----------必选参数
    
    249 #   arg6: 加/减[0/1]:1为递增,0为递减。                  ----------必选参数
    
    250 #  示例:                                                 
    
    251 #    add = %mac1%,%mac%,8,0,2,1                 
    
    252 #                                                        
    
    253 #########################################################")
    254     bool add (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    255 
    256 
    257 #define D_LOOPFIND ("
    258 #########################################################
    
    259 # 函数说明:
    
    260 #   在一定的时间内下一串指令然后通过正则表达式查找是否有返回所需要的值  
    
    261 #   
    
    262 # 参数说明:
    
    263 #   arg1: 发送的指令 ----------必选参数
    
    264 #   arg2: 总时间        ----------必选参数
    
    265 #   arg3: 单步循环时间 ----------必选参数
    
    266 #   arg4: 需要查找的值 ----------必选参数
    
    267 #   arg5: 目标通讯,无为匿名通讯 通讯命名[任意名字] ---可选
    
    268 #  示例:                                                 
    
    269 #    loopfind = NULL, 40000,10000,rstBtn_pressed                  
    
    270 #                                                        
    
    271 #########################################################")
    272     bool loopfind (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    273 
    274 
    275 
    276 #define D_CHANGE ("
    277 #########################################################
    
    278 # 函数说明:
    
    279 #  从[源字符串名称]获取的数据,用[正则式]匹配出来的子字符串,根据[改变的方式]对子字符串进行格式上的转换并保存到[目标字符名称]  
    
    280 #   
    
    281 # 参数说明:
    
    282 #   arg1: 目标字符串名 ----------必选参数
    
    283 #   arg2: 源字符名称        ----------必选参数
    
    284 #   arg3: 正则式 ----------必选参数
    
    285 #   arg4: 表达式所在组 ----------必选参数
    
    286 #   arg5: 改变的方式 0:无改变;1:变为小写,2,变为大写---必选参数
    
    287 #  示例:                                                 
    
    288 #    loopfind = NULL, 40000,10000,rstBtn_pressed                  
    
    289 #                                                        
    
    290 #########################################################")
    291     bool change (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
    292 
    293 };
    294 #endif // CMU_H
    2、注册对象到JavaScript解释器

    注意要是在不同的函数调用需要使用new 创建注册的对象以免函数执行完毕被销毁
        CMU * cmu = new CMU();
        QScriptValue qcmu = eng->newQObject(cmu);
        eng->globalObject().setProperty(this->get_moudle_name().c_str(), qcmu);
    
    
      1 /******************************************************************************************************
      2 * Copyright (C) 2014, All right reserved.
      3 
      4 * file
      5 * version  1.0
      6 * author   NingJian (freegodly@gmail.com)
      7 * brief
      8 
      9 * detail
     10 
     11 * TODO
     12 * history  2014-9-17 created by NingJian
     13 *
     14 * note
     15 ******************************************************************************************************/
     16 
     17 #include "stt_basic_moudle.h"
     18 #include "cmu.h"
     19 
     20 
     21 std::map<int,TEST_INFO> *STT_Basic_Moudle::STT_G_Test_Info;
     22 
     23 std::map<std::string,TEST_FUN_INFO> *STT_Basic_Moudle::STT_G_Test_Fun_Info;
     24 
     25 RUN_FUN STT_Basic_Moudle::STT_G_Test_Run_Fun;
     26 
     27 std::map<std::string,std::string>     *STT_Basic_Moudle::STT_G_Moudles_Config;
     28 
     29 
     30 STT_Basic_Moudle::STT_Basic_Moudle()
     31 {
     32 
     33 }
     34 
     35 
     36 bool STT_Basic_Moudle::init(std::map<int, TEST_INFO> &test_info, std::map<string, TEST_FUN_INFO> &test_fun_info, std::map<string, string> &moudles_config, RUN_FUN run_fun) const
     37 {
     38 
     39     STT_Basic_Moudle::STT_G_Test_Info = &test_info;
     40     STT_Basic_Moudle::STT_G_Test_Fun_Info = &test_fun_info;
     41     STT_Basic_Moudle::STT_G_Test_Run_Fun = run_fun;
     42     STT_Basic_Moudle::STT_G_Moudles_Config = &moudles_config;
     43     return true;
     44 }
     45 
     46 bool STT_Basic_Moudle::release() const
     47 {
     48     return true;
     49 }
     50 
     51 bool STT_Basic_Moudle::initiation(int test_id) const
     52 {
     53     return true;
     54 }
     55 
     56 bool STT_Basic_Moudle::finish(int test_id) const
     57 {
     58     std::string error_str;
     59     CMU_INFO  ci = CMU_Table[test_id];
     60     if( ci.anonymous_commu != NULL )
     61     {
     62         ci.anonymous_commu->fnClose(error_str);
     63     }
     64     std::map<std::string, CCommunication*>::iterator it = ci.name_commu.begin();
     65     while(it != ci.name_commu.end())
     66     {
     67         it->second->fnClose(error_str);
     68         it++;
     69     }
     70     ci.name_commu.clear();
     71     return true;
     72 }
     73 
     74 
     75 
     76 
     77 std::string STT_Basic_Moudle::get_moudle_version() const
     78 {
     79     return std::string("Version: V1.0.0  
    " ) + STT_BUILD_TIME ;
     80 }
     81 
     82 std::string STT_Basic_Moudle::get_moudle_describe() const
     83 {
     84     return "基本功能模块";
     85 }
     86 
     87 void STT_Basic_Moudle::reg_ui_fun(REG_UI_FUN reg_ui_f) const
     88 {
     89 
     90 }
     91 
     92 void STT_Basic_Moudle::reg_fun(int test_id,QScriptEngine *eng) const
     93 {
     94     CMU * cmu = new CMU();
     95     QScriptValue qcmu = eng->newQObject(cmu);
     96     eng->globalObject().setProperty(this->get_moudle_name().c_str(), qcmu);
     97 
     98 
     99     add_fun(this->get_moudle_name().c_str(),   "connect",         D_CONNECT      );
    100     add_fun(this->get_moudle_name().c_str(),  "close",             D_CLOSE       );
    101     add_fun( this->get_moudle_name().c_str(),   "send",              D_SEND      );
    102     add_fun(this->get_moudle_name().c_str(),   "receive",          D_RECEIVE     );
    103     add_fun(this->get_moudle_name().c_str(),  "ping",               D_PING       );
    104     add_fun(this->get_moudle_name().c_str(),   "sleep",             D_SLEEP      );
    105     add_fun( this->get_moudle_name().c_str(),   "find",                D_FIND    );
    106     add_fun(this->get_moudle_name().c_str(),   "loopchk",         D_LOOPCHK      );
    107     add_fun( this->get_moudle_name().c_str(),   "check",            D_CHECK      );
    108     add_fun( this->get_moudle_name().c_str(),  "set",                 D_SET      );
    109     add_fun(this->get_moudle_name().c_str(),   "stringAdd",      D_STRINGADD     );
    110     add_fun( this->get_moudle_name().c_str(),   "compare",       D_COMPARE       );
    111     add_fun( this->get_moudle_name().c_str(),   "add",                D_ADD      );
    112     add_fun(this->get_moudle_name().c_str(),   "loopfind",         D_LOOPFIND    );
    113     add_fun( this->get_moudle_name().c_str(),   "change",          D_CHANGE      );
    114 }
    115 
    116 
    117 
    118 
    119 string STT_Basic_Moudle::get_moudle_name() const
    120 {
    121     return "STT_Basic_Moudle";
    122 }
    123 
    124 
    125 
    126 
    127 
    128 string get_stt_variable(int test_id, string key)
    129 {
    130     return (*STT_Basic_Moudle::STT_G_Test_Info)[test_id].variable_map[key];
    131 }
    132 
    133 
    134 void set_stt_variable(int test_id, string key, string value)
    135 {
    136     (*STT_Basic_Moudle::STT_G_Test_Info)[test_id].variable_map.insert(std::pair<std::string,std::string>(key,value));
    137 }
    138 
    139 
    140 
    141 
    142 
    143 void add_fun(const char *moudle_name, const char *fun_name, const char *fun_describe)
    144 {
    145 
    146     if((*STT_Basic_Moudle::STT_G_Test_Fun_Info).find(fun_name)==(*STT_Basic_Moudle::STT_G_Test_Fun_Info).end())
    147     {
    148         TEST_FUN_INFO tfi={moudle_name,fun_name,fun_describe};
    149         (*STT_Basic_Moudle::STT_G_Test_Fun_Info).insert(std::pair<std::string,TEST_FUN_INFO>(fun_name,tfi));
    150     }
    151 }
    
    
    
    3、使用
    我的注册时在插件里实现的,调用在主程序里,这样可以n个插件向同一个javascript解释器里注册不同的对象
    执行完一次可以判断是否有异常,打印异常信息等
     1 ///
     2 /// rief G_STT_Interpreter [STT解释器]
     3 ///
     4 std::map<int,QScriptEngine *> G_STT_Interpreter;
     5 
     6 
     7 /* ############################################################################################################# */
     8 
     9 
    10 bool G_STT_Run_Fun(QString fun_name, int test_id, QString v1, QString v2, QString v3, QString v4, QString v5, QString v6, QString v7, QString v8, QString v9)
    11 {
    12     bool result = false;
    13     TEST_FUN_INFO tfi = G_Test_Fun_Info[fun_name.toStdString()];
    14 
    15     if(tfi.fun_name == fun_name.toStdString())
    16     {
    17         QString script=QString("%1.%2").arg(tfi.modle_name.c_str(),fun_name);
    18 
    19         QScriptValueList args;
    20         QScriptEngine * eng =  G_STT_Interpreter[test_id];
    21         args << test_id << v1<<v2<<v3<< v4<<v5<<v6<< v7<<v8<<v9;
    22         QScriptValue cpp_fun = eng->evaluate(script);
    23         qDebug()<<cpp_fun.toString();
    24         QScriptValue value =  cpp_fun.call(QScriptValue(), args);
    25 
    26 
    27         if (G_STT_Interpreter[test_id]->hasUncaughtException()){
    28             emit STT_Global::mw->signal_add_Log(test_id, G_STT_Interpreter[test_id]->uncaughtException().toString());
    29             emit STT_Global::mw->signal_add_Log(test_id,G_STT_Interpreter[test_id]->uncaughtExceptionBacktrace().join("/n"));
    30             qDebug()<<G_STT_Interpreter[test_id]->uncaughtException().toString();
    31             qDebug()<<G_STT_Interpreter[test_id]->uncaughtExceptionBacktrace().join("/n");
    32             return false;
    33         }else{
    34             result = value.toBool();
    35         }
    36 
    37     }
    38 
    39     return result;
    40 }
    
    
    


  • 相关阅读:
    算法的时间复杂度与空间复杂度
    递归八皇后问题(回溯算法)
    vue之插件
    递归之打印、阶乘、九九乘法表、迷宫问题
    选择排序
    归并排序
    sql 字符保留汉字处理
    JAVA filter map groupingBy Collectors
    2021最新版IDEA激活
    WPF 程序退出,进程依然存在
  • 原文地址:https://www.cnblogs.com/freegodly/p/4250830.html
Copyright © 2011-2022 走看看