QT自定義對象導入JavaScript腳本使用

一、對象javascript

  項目屬性要添加java

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     /// \brief CMU_Table
 14     ///  name
 15     ///
 16     std::map<std::string, CCommunication*> name_commu;
 17     ///
 18     /// \brief anonymous_commu
 19     ///
 20     CCommunication* anonymous_commu;
 21 };
 22 
 23 ///
 24 /// \brief 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 #########################################################\r\n\
 36 # 函數說明:\r\n\
 37 #   打開並鏈接通信 目前支持 telnet、console、系統命令行  \r\n\
 38 #   \r\n\
 39 # 參數說明:\r\n\
 40 #   arg1: 鏈接模式[telnet;console,cmd] ----------必選參數\r\n\
 41 #   arg2: 是否使用配置登錄,0默認登錄,1不登錄 [0;1]---可選\r\n\
 42 #   arg3: 匿名通信會自動關閉,給當前通信命名[任意名字]   \r\n\
 43 #   arg4: 無                                             \r\n\
 44 #   arg5: 無                                             \r\n\
 45 #   arg6: 無                                             \r\n\
 46 #  示例:                                                 \r\n\
 47 #    connect = telnet , 0 , cpe_telnet                   \r\n\
 48 #                                                        \r\n\
 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 #########################################################\r\n\
 55 # 函數說明:\r\n\
 56 #   關閉通信 目前支持 telnet、console、系統命令行  \r\n\
 57 #   \r\n\
 58 # 參數說明:\r\n\
 59 #   arg1: 鏈接模式[telnet;console,cmd] ----------必選參數\r\n\
 60 #   arg2: 匿名通信會自動關閉,關閉通信命名[任意名字] ---可選\r\n\
 61 #  示例:                                                 \r\n\
 62 #    connect = telnet ,  cpe_telnet                   \r\n\
 63 #                                                        \r\n\
 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 #########################################################\r\n\
 70 # 函數說明:\r\n\
 71 #   發送命令到通信 目前支持 telnet、console、系統命令行  \r\n\
 72 #   \r\n\
 73 # 參數說明:\r\n\
 74 #   arg1: 發送的命令 ----------必選參數\r\n\
 75 #   arg2: 發送目標通信,無爲匿名通信 通信命名[任意名字] ---可選\r\n\
 76 #  示例:                                                 \r\n\
 77 #    send = dir ,  cpe_telnet                   \r\n\
 78 #                                                        \r\n\
 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 #########################################################\r\n\
 85 # 函數說明:\r\n\
 86 #   發送命令到通信 目前支持 telnet、console、系統命令行  \r\n\
 87 #   \r\n\
 88 # 參數說明:\r\n\
 89 #   arg1: 延時時間 ----------必選參數\r\n\
 90 #   arg2: 爲正則表達式 ----------必選參數\r\n\
 91 #   arg3: 須要查找的值在正則表達式的第幾組內 ----------必選參數\r\n\
 92 #   arg4: 獲取的結果保存到變量,默認RECEIVE ----------可選參數\r\n\
 93 #   arg5: 發送目標通信,無爲匿名通信 通信命名[任意名字] ---可選\r\n\
 94 #  示例:                                                 \r\n\
 95 #    receive = 2000,Mac.Address.{2}(.*).,1,para                  \r\n\
 96 #                                                        \r\n\
 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 #########################################################\r\n\
104 # 函數說明:\r\n\
105 #   ping  \r\n\
106 #   \r\n\
107 # 參數說明:\r\n\
108 #   arg1: 目標IP ----------必選參數\r\n\
109 #   arg2: 源IP  [使用默認路由設置] ----------可選參數\r\n\
110 #   arg3: PING包的次數 默認4 ----------可選參數\r\n\
111 #   arg4: PING通的連續成功次數,默認1 ----------可選參數\r\n\
112 #   arg5: PING包的大小 默認64 ---可選\r\n\
113 #  示例:                                                 \r\n\
114 #   ping = %ip%,,60,3,64                  \r\n\
115 #                                                        \r\n\
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 #########################################################\r\n\
121 # 函數說明:\r\n\
122 #   示設置延時的時間  \r\n\
123 #   \r\n\
124 # 參數說明:\r\n\
125 #   arg1: 延時時間,時間單位爲毫秒 ----------必選參數\r\n\
126 #  示例:                                                 \r\n\
127 #   sleep = 2000                 \r\n\
128 #                                                        \r\n\
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 #########################################################\r\n\
134 # 函數說明:\r\n\
135 #   查找通信返回信息相應的值  \r\n\
136 #   \r\n\
137 # 參數說明:\r\n\
138 #   arg1: 延時時間,時間單位爲毫秒 ----------必選參數\r\n\
139 #   arg2: 要查找得值 ----------必選參數\r\n\
140 #   arg3: 發送目標通信,無爲匿名通信 通信命名[任意名字] ---可選\r\n\
141 #  示例:                                                 \r\n\
142 #   find = 3000,succee                 \r\n\
143 #                                                        \r\n\
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 #########################################################\r\n\
151 # 函數說明:\r\n\
152 #   在必定的時間內下一串指令而後經過正則表達式查找是否有返回所須要的值  \r\n\
153 #   \r\n\
154 # 參數說明:\r\n\
155 #   arg1: 發送的指令 ----------必選參數\r\n\
156 #   arg2: 總時間        ----------必選參數\r\n\
157 #   arg3: 正則表達式 ----------必選參數\r\n\
158 #   arg4: 須要查找的值在正則表達式的第幾組內 ----------必選參數\r\n\
159 #   arg5: 發送完指令後等待時間 默認0----------可選參數\r\n\
160 #   arg6: 獲取的結果保存到變量,默認RECEIVE ----------可選參數\r\n\
161 #   arg7: 目標通信,無爲匿名通信 通信命名[任意名字] ---可選\r\n\
162 #  示例:                                                 \r\n\
163 #    loopchk = adsl info,5000,Path.*\D\d.*\D(\d*)\DKbps.*Downstream,1,1                  \r\n\
164 #                                                        \r\n\
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 #########################################################\r\n\
170 # 函數說明:\r\n\
171 #   若是須要比較相同,則使用一個參數,若是須要比較範圍,則須要使用兩個參數,用來表示上下限  \r\n\
172 #   \r\n\
173 # 參數說明:\r\n\
174 #   arg1: 比較值1   爲數值擇是上線                    ----------必選參數\r\n\
175 #   arg2: 比較值2  不爲空則是數值範圍比較下線 ----------可選參數\r\n\
176 #   arg3: 目標變量,默認RECEIVE                       ----------可選參數\r\n\
177 #  示例:                                                 \r\n\
178 #    check = %up_rate%,%down_rate%                   \r\n\
179 #                                                        \r\n\
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 #########################################################\r\n\
186 # 函數說明:\r\n\
187 #   用來將receive指令經過正則表達匹配到的值保存一個變量裏  \r\n\
188 #   若是有四個參數:set = 新變量名,變量名,分隔符類型(數字),分隔數量  \r\n\
189 #   分隔符類型有:0->無,1->:,2->-,3->.,4->%3A,5->空格,6->空格  \r\n\
190 #   \r\n\
191 # 參數說明:\r\n\
192 #   arg1: 目標變量名                                                 ----------必選參數\r\n\
193 #   arg2: 源數據                                                        ----------可選參數\r\n\
194 #   arg3: 分隔符類型 0->無,1->:,2->-,3->.,4->%3A,5->空格,6->空格(除了空格,數據會變成十六進制)----------可選參數\r\n\
195 #   arg4: 分隔數量                                                     ----------可選參數\r\n\
196 #  示例:                                                 \r\n\
197 #    set = newmac,%mac%,1,2                 \r\n\
198 #                                                        \r\n\
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 #########################################################\r\n\
204 # 函數說明:\r\n\
205 #   根據具體截取數值肯定累積參數增長  \r\n\
206 #   \r\n\
207 # 參數說明:\r\n\
208 #   arg1: 目的截取後的數值字符串                             ----------必選參數\r\n\
209 #   arg2: stringAdd指令所用到參數的個數(包含自己) ----------必選參數\r\n\
210 #   arg3: 前綴字符串                                                 ----------必選參數\r\n\
211 #   arg4: 括號內的第一個參數表示被截取的字符串,第二個參數表示起始位,第三個參數表示位數長度 ----------必選參數\r\n\
212 #   arg..:   同[arg4] \r\n\
213 #  示例:                                                 \r\n\
214 #    stringAdd = %StrNew%,4,Str(WLAN_),Sub(&mac&;9;4)                 \r\n\
215 #                                                        \r\n\
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 #########################################################\r\n\
222 # 函數說明:\r\n\
223 #   表示用於目的字符串的值與源字符串的值進行對比  \r\n\
224 #   \r\n\
225 # 參數說明:\r\n\
226 #   arg1: 目的字符串的值                             ----------必選參數\r\n\
227 #   arg2: 是源字符串的值                             ----------必選參數\r\n\
228 #   arg3: 第一個參數截取子字符串的索引號  ----------可選參數\r\n\
229 #   arg4: 截取子字符串的長度                      ----------可選參數\r\n\
230 #  示例:                                                 \r\n\
231 #    compare = %StrNew%,%ssid%,2,3                 \r\n\
232 #                                                        \r\n\
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 #########################################################\r\n\
239 # 函數說明:\r\n\
240 #   將源字符串的內容加/減一個數,而後按指定格式保存到目的字符串的變 \r\n\
241 #   量裏  \r\n\
242 #   \r\n\
243 # 參數說明:\r\n\
244 #   arg1: 目的字符串的值                                  ----------必選參數\r\n\
245 #   arg2: 是源字符串的值                                  ----------必選參數\r\n\
246 #   arg3: 被加/減數[整數]:表示要減或加的參數   ----------必選參數\r\n\
247 #   arg4: 目的字符串格式[整數]:參數表示指定的間隔符(0:無,1: \":\",2: \"-\",3: \".\",4: \"%3A\",5:\" \")----------必選參數\r\n\
248 #   arg5: 目的串截取段[整數]:間隔符之間的字符數   ----------必選參數\r\n\
249 #   arg6: 加/減[0/1]:1爲遞增,0爲遞減。                  ----------必選參數\r\n\
250 #  示例:                                                 \r\n\
251 #    add = %mac1%,%mac%,8,0,2,1                 \r\n\
252 #                                                        \r\n\
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 #########################################################\r\n\
259 # 函數說明:\r\n\
260 #   在必定的時間內下一串指令而後經過正則表達式查找是否有返回所須要的值  \r\n\
261 #   \r\n\
262 # 參數說明:\r\n\
263 #   arg1: 發送的指令 ----------必選參數\r\n\
264 #   arg2: 總時間        ----------必選參數\r\n\
265 #   arg3: 單步循環時間 ----------必選參數\r\n\
266 #   arg4: 須要查找的值 ----------必選參數\r\n\
267 #   arg5: 目標通信,無爲匿名通信 通信命名[任意名字] ---可選\r\n\
268 #  示例:                                                 \r\n\
269 #    loopfind = NULL, 40000,10000,rstBtn_pressed                  \r\n\
270 #                                                        \r\n\
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 #########################################################\r\n\
278 # 函數說明:\r\n\
279 #  從[源字符串名稱]獲取的數據,用[正則式]匹配出來的子字符串,根據[改變的方式]對子字符串進行格式上的轉換並保存到[目標字符名稱]  \r\n\
280 #   \r\n\
281 # 參數說明:\r\n\
282 #   arg1: 目標字符串名 ----------必選參數\r\n\
283 #   arg2: 源字符名稱        ----------必選參數\r\n\
284 #   arg3: 正則式 ----------必選參數\r\n\
285 #   arg4: 表達式所在組 ----------必選參數\r\n\
286 #   arg5: 改變的方式 0:無改變;1:變爲小寫,2,變爲大寫---必選參數\r\n\
287 #  示例:                                                 \r\n\
288 #    loopfind = NULL, 40000,10000,rstBtn_pressed                  \r\n\
289 #                                                        \r\n\
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

 

二、註冊對象到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  \r\n" ) + 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 }
 

 

三、使用
個人註冊時在插件裏實現的,調用在主程序裏,這樣能夠n個插件向同一個javascript解釋器裏註冊不一樣的對象
執行完一次能夠判斷是否有異常,打印異常信息等
 1 ///
 2 /// \brief 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 }
相關文章
相關標籤/搜索