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 }




原文地址:https://www.cnblogs.com/freegodly/p/4250830.html