歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Qt自定義對象導入JavaScript腳本使用

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

日期:2017/3/1 9:34:13   编辑:Linux編程

1、對象

項目屬性要添加

QT += script

自定義的對象頭文件如下,實現正常就好,記得腳本裡要調用的方法一定要定義在public slots:下,要不然調用時提示該對象沒有*方法

#ifndef CMU_H
#define CMU_H
#include "Communication/Communication.h"
#include "stt_basic_moudle.h"
#include <iostream>
#include <map>
using namespace std;


struct CMU_INFO
{
///
/// \brief CMU_Table
/// name
///
std::map<std::string, CCommunication*> name_commu;
///
/// \brief anonymous_commu
///
CCommunication* anonymous_commu;
};

///
/// \brief CMU_Table
///
extern std::map<int,CMU_INFO> CMU_Table;

class CMU:public QObject
{
Q_OBJECT

public slots:

#define D_CONNECT ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 打開並連接通訊 目前支持 telnet、console、系統命令行 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 連接模式[telnet;console,cmd] ----------必選參數\r\n\
# arg2: 是否使用配置登陸,0默認登陸,1不登陸 [0;1]---可選\r\n\
# arg3: 匿名通訊會自動關閉,給當前通訊命名[任意名字] \r\n\
# arg4: 無 \r\n\
# arg5: 無 \r\n\
# arg6: 無 \r\n\
# 示例: \r\n\
# connect = telnet , 0 , cpe_telnet \r\n\
# \r\n\
#########################################################")
bool connect (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);


#define D_CLOSE ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 關閉通訊 目前支持 telnet、console、系統命令行 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 連接模式[telnet;console,cmd] ----------必選參數\r\n\
# arg2: 匿名通訊會自動關閉,關閉通訊命名[任意名字] ---可選\r\n\
# 示例: \r\n\
# connect = telnet , cpe_telnet \r\n\
# \r\n\
#########################################################")
bool close (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);


#define D_SEND ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 發送命令到通訊 目前支持 telnet、console、系統命令行 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 發送的命令 ----------必選參數\r\n\
# arg2: 發送目標通訊,無為匿名通訊 通訊命名[任意名字] ---可選\r\n\
# 示例: \r\n\
# send = dir , cpe_telnet \r\n\
# \r\n\
#########################################################")
bool send (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);


#define D_RECEIVE ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 發送命令到通訊 目前支持 telnet、console、系統命令行 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 延時時間 ----------必選參數\r\n\
# arg2: 為正則表達式 ----------必選參數\r\n\
# arg3: 需要查找的值在正則表達式的第幾組內 ----------必選參數\r\n\
# arg4: 獲取的結果保存到變量,默認RECEIVE ----------可選參數\r\n\
# arg5: 發送目標通訊,無為匿名通訊 通訊命名[任意名字] ---可選\r\n\
# 示例: \r\n\
# receive = 2000,Mac.Address.{2}(.*).,1,para \r\n\
# \r\n\
#########################################################")
bool receive(int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

#define D_PING ("\
#########################################################\r\n\
# 函數說明:\r\n\
# ping \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 目標IP ----------必選參數\r\n\
# arg2: 源IP [使用默認路由設置] ----------可選參數\r\n\
# arg3: PING包的次數 默認4 ----------可選參數\r\n\
# arg4: PING通的連續成功次數,默認1 ----------可選參數\r\n\
# arg5: PING包的大小 默認64 ---可選\r\n\
# 示例: \r\n\
# ping = %ip%,,60,3,64 \r\n\
# \r\n\
#########################################################")
bool ping (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

#define D_SLEEP ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 示設置延時的時間 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 延時時間,時間單位為毫秒 ----------必選參數\r\n\
# 示例: \r\n\
# sleep = 2000 \r\n\
# \r\n\
#########################################################")
bool sleep (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

#define D_FIND ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 查找通訊返回信息相應的值 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 延時時間,時間單位為毫秒 ----------必選參數\r\n\
# arg2: 要查找得值 ----------必選參數\r\n\
# arg3: 發送目標通訊,無為匿名通訊 通訊命名[任意名字] ---可選\r\n\
# 示例: \r\n\
# find = 3000,succee \r\n\
# \r\n\
#########################################################")
bool find (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

#define D_LOOPCHK ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 在一定的時間內下一串指令然後通過正則表達式查找是否有返回所需要的值 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 發送的指令 ----------必選參數\r\n\
# arg2: 總時間 ----------必選參數\r\n\
# arg3: 正則表達式 ----------必選參數\r\n\
# arg4: 需要查找的值在正則表達式的第幾組內 ----------必選參數\r\n\
# arg5: 發送完指令後等待時間 默認0----------可選參數\r\n\
# arg6: 獲取的結果保存到變量,默認RECEIVE ----------可選參數\r\n\
# arg7: 目標通訊,無為匿名通訊 通訊命名[任意名字] ---可選\r\n\
# 示例: \r\n\
# loopchk = adsl info,5000,Path.*\D\d.*\D(\d*)\DKbps.*Downstream,1,1 \r\n\
# \r\n\
#########################################################")
bool loopchk(int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

#define D_CHECK ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 如果需要比較相同,則使用一個參數,如果需要比較范圍,則需要使用兩個參數,用來表示上下限 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 比較值1 為數值擇是上線 ----------必選參數\r\n\
# arg2: 比較值2 不為空則是數值范圍比較下線 ----------可選參數\r\n\
# arg3: 目標變量,默認RECEIVE ----------可選參數\r\n\
# 示例: \r\n\
# check = %up_rate%,%down_rate% \r\n\
# \r\n\
#########################################################")
bool check (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);


#define D_SET ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 用來將receive指令通過正則表達匹配到的值保存一個變量裡 \r\n\
# 如果有四個參數:set = 新變量名,變量名,分隔符類型(數字),分隔數量 \r\n\
# 分隔符類型有:0->無,1->:,2->-,3->.,4->%3A,5->空格,6->空格 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 目標變量名 ----------必選參數\r\n\
# arg2: 源數據 ----------可選參數\r\n\
# arg3: 分隔符類型 0->無,1->:,2->-,3->.,4->%3A,5->空格,6->空格(除了空格,數據會變成十六進制)----------可選參數\r\n\
# arg4: 分隔數量 ----------可選參數\r\n\
# 示例: \r\n\
# set = newmac,%mac%,1,2 \r\n\
# \r\n\
#########################################################")
bool set (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

#define D_STRINGADD ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 根據具體截取數值確定累積參數增加 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 目的截取後的數值字符串 ----------必選參數\r\n\
# arg2: stringAdd指令所用到參數的個數(包含本身) ----------必選參數\r\n\
# arg3: 前綴字符串 ----------必選參數\r\n\
# arg4: 括號內的第一個參數表示被截取的字符串,第二個參數表示起始位,第三個參數表示位數長度 ----------必選參數\r\n\
# arg..: 同[arg4] \r\n\
# 示例: \r\n\
# stringAdd = %StrNew%,4,Str(WLAN_),Sub(&mac&;9;4) \r\n\
# \r\n\
#########################################################")
bool stringAdd (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);


#define D_COMPARE ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 表示用於目的字符串的值與源字符串的值進行對比 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 目的字符串的值 ----------必選參數\r\n\
# arg2: 是源字符串的值 ----------必選參數\r\n\
# arg3: 第一個參數截取子字符串的索引號 ----------可選參數\r\n\
# arg4: 截取子字符串的長度 ----------可選參數\r\n\
# 示例: \r\n\
# compare = %StrNew%,%ssid%,2,3 \r\n\
# \r\n\
#########################################################")
bool compare (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);


#define D_ADD ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 將源字符串的內容加/減一個數,然後按指定格式保存到目的字符串的變 \r\n\
# 量裡 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 目的字符串的值 ----------必選參數\r\n\
# arg2: 是源字符串的值 ----------必選參數\r\n\
# arg3: 被加/減數[整數]:表示要減或加的參數 ----------必選參數\r\n\
# arg4: 目的字符串格式[整數]:參數表示指定的間隔符(0:無,1: \":\",2: \"-\",3: \".\",4: \"%3A\",5:\" \")----------必選參數\r\n\
# arg5: 目的串截取段[整數]:間隔符之間的字符數 ----------必選參數\r\n\
# arg6: 加/減[0/1]:1為遞增,0為遞減。 ----------必選參數\r\n\
# 示例: \r\n\
# add = %mac1%,%mac%,8,0,2,1 \r\n\
# \r\n\
#########################################################")
bool add (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);


#define D_LOOPFIND ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 在一定的時間內下一串指令然後通過正則表達式查找是否有返回所需要的值 \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 發送的指令 ----------必選參數\r\n\
# arg2: 總時間 ----------必選參數\r\n\
# arg3: 單步循環時間 ----------必選參數\r\n\
# arg4: 需要查找的值 ----------必選參數\r\n\
# arg5: 目標通訊,無為匿名通訊 通訊命名[任意名字] ---可選\r\n\
# 示例: \r\n\
# loopfind = NULL, 40000,10000,rstBtn_pressed \r\n\
# \r\n\
#########################################################")
bool loopfind (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

#define D_CHANGE ("\
#########################################################\r\n\
# 函數說明:\r\n\
# 從[源字符串名稱]獲取的數據,用[正則式]匹配出來的子字符串,根據[改變的方式]對子字符串進行格式上的轉換並保存到[目標字符名稱] \r\n\
# \r\n\
# 參數說明:\r\n\
# arg1: 目標字符串名 ----------必選參數\r\n\
# arg2: 源字符名稱 ----------必選參數\r\n\
# arg3: 正則式 ----------必選參數\r\n\
# arg4: 表達式所在組 ----------必選參數\r\n\
# arg5: 改變的方式 0:無改變;1:變為小寫,2,變為大寫---必選參數\r\n\
# 示例: \r\n\
# loopfind = NULL, 40000,10000,rstBtn_pressed \r\n\
# \r\n\
#########################################################")
bool change (int test_id,QString arg1,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);

};
#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);

/******************************************************************************************************
* Copyright (C) 2014, All right reserved.

* file
* version 1.0
* author NingJian ([email protected])
* brief

* detail

* TODO
* history 2014-9-17 created by NingJian
*
* note
******************************************************************************************************/

#include "stt_basic_moudle.h"
#include "cmu.h"


std::map<int,TEST_INFO> *STT_Basic_Moudle::STT_G_Test_Info;

std::map<std::string,TEST_FUN_INFO> *STT_Basic_Moudle::STT_G_Test_Fun_Info;

RUN_FUN STT_Basic_Moudle::STT_G_Test_Run_Fun;

std::map<std::string,std::string> *STT_Basic_Moudle::STT_G_Moudles_Config;


STT_Basic_Moudle::STT_Basic_Moudle()
{

}


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
{

STT_Basic_Moudle::STT_G_Test_Info = &test_info;
STT_Basic_Moudle::STT_G_Test_Fun_Info = &test_fun_info;
STT_Basic_Moudle::STT_G_Test_Run_Fun = run_fun;
STT_Basic_Moudle::STT_G_Moudles_Config = &moudles_config;
return true;
}

bool STT_Basic_Moudle::release() const
{
return true;
}

bool STT_Basic_Moudle::initiation(int test_id) const
{
return true;
}

bool STT_Basic_Moudle::finish(int test_id) const
{
std::string error_str;
CMU_INFO ci = CMU_Table[test_id];
if( ci.anonymous_commu != NULL )
{
ci.anonymous_commu->fnClose(error_str);
}
std::map<std::string, CCommunication*>::iterator it = ci.name_commu.begin();
while(it != ci.name_commu.end())
{
it->second->fnClose(error_str);
it++;
}
ci.name_commu.clear();
return true;
}


std::string STT_Basic_Moudle::get_moudle_version() const
{
return std::string("Version: V1.0.0 \r\n" ) + STT_BUILD_TIME ;
}

std::string STT_Basic_Moudle::get_moudle_describe() const
{
return "基本功能模塊";
}

void STT_Basic_Moudle::reg_ui_fun(REG_UI_FUN reg_ui_f) const
{

}

void STT_Basic_Moudle::reg_fun(int test_id,QScriptEngine *eng) const
{
CMU * cmu = new CMU();
QScriptValue qcmu = eng->newQObject(cmu);
eng->globalObject().setProperty(this->get_moudle_name().c_str(), qcmu);


add_fun(this->get_moudle_name().c_str(), "connect", D_CONNECT );
add_fun(this->get_moudle_name().c_str(), "close", D_CLOSE );
add_fun( this->get_moudle_name().c_str(), "send", D_SEND );
add_fun(this->get_moudle_name().c_str(), "receive", D_RECEIVE );
add_fun(this->get_moudle_name().c_str(), "ping", D_PING );
add_fun(this->get_moudle_name().c_str(), "sleep", D_SLEEP );
add_fun( this->get_moudle_name().c_str(), "find", D_FIND );
add_fun(this->get_moudle_name().c_str(), "loopchk", D_LOOPCHK );
add_fun( this->get_moudle_name().c_str(), "check", D_CHECK );
add_fun( this->get_moudle_name().c_str(), "set", D_SET );
add_fun(this->get_moudle_name().c_str(), "stringAdd", D_STRINGADD );
add_fun( this->get_moudle_name().c_str(), "compare", D_COMPARE );
add_fun( this->get_moudle_name().c_str(), "add", D_ADD );
add_fun(this->get_moudle_name().c_str(), "loopfind", D_LOOPFIND );
add_fun( this->get_moudle_name().c_str(), "change", D_CHANGE );
}


string STT_Basic_Moudle::get_moudle_name() const
{
return "STT_Basic_Moudle";
}

string get_stt_variable(int test_id, string key)
{
return (*STT_Basic_Moudle::STT_G_Test_Info)[test_id].variable_map[key];
}


void set_stt_variable(int test_id, string key, string value)
{
(*STT_Basic_Moudle::STT_G_Test_Info)[test_id].variable_map.insert(std::pair<std::string,std::string>(key,value));
}

void add_fun(const char *moudle_name, const char *fun_name, const char *fun_describe)
{

if((*STT_Basic_Moudle::STT_G_Test_Fun_Info).find(fun_name)==(*STT_Basic_Moudle::STT_G_Test_Fun_Info).end())
{
TEST_FUN_INFO tfi={moudle_name,fun_name,fun_describe};
(*STT_Basic_Moudle::STT_G_Test_Fun_Info).insert(std::pair<std::string,TEST_FUN_INFO>(fun_name,tfi));
}
}

3、使用
我的注冊時在插件裡實現的,調用在主程序裡,這樣可以n個插件向同一個javascript解釋器裡注冊不同的對象
執行完一次可以判斷是否有異常,打印異常信息等

///
/// \brief G_STT_Interpreter [STT解釋器]
///
std::map<int,QScriptEngine *> G_STT_Interpreter;


/* ############################################################################################################# */


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)
{
bool result = false;
TEST_FUN_INFO tfi = G_Test_Fun_Info[fun_name.toStdString()];

if(tfi.fun_name == fun_name.toStdString())
{
QString script=QString("%1.%2").arg(tfi.modle_name.c_str(),fun_name);

QScriptValueList args;
QScriptEngine * eng = G_STT_Interpreter[test_id];
args << test_id << v1<<v2<<v3<< v4<<v5<<v6<< v7<<v8<<v9;
QScriptValue cpp_fun = eng->evaluate(script);
qDebug()<<cpp_fun.toString();
QScriptValue value = cpp_fun.call(QScriptValue(), args);


if (G_STT_Interpreter[test_id]->hasUncaughtException()){
emit STT_Global::mw->signal_add_Log(test_id, G_STT_Interpreter[test_id]->uncaughtException().toString());
emit STT_Global::mw->signal_add_Log(test_id,G_STT_Interpreter[test_id]->uncaughtExceptionBacktrace().join("/n"));
qDebug()<<G_STT_Interpreter[test_id]->uncaughtException().toString();
qDebug()<<G_STT_Interpreter[test_id]->uncaughtExceptionBacktrace().join("/n");
return false;
}else{
result = value.toBool();
}

}

return result;
}

Ubuntu 環境下Gtk與QT編譯環境安裝與配置 http://www.linuxidc.com/Linux/2013-08/88539.htm

Linux系統下QT環境搭建 http://www.linuxidc.com/Linux/2013-07/87576.htm

Ubuntu下QT控制台程序無法運行的解決方案以及XTerm的配置方法 http://www.linuxidc.com/Linux/2013-06/86244.htm

Ubuntu 10.04下QT4.7.4移植詳解 http://www.linuxidc.com/Linux/2013-01/77930.htm

Ubuntu 14.04下安裝部署Qt5開發環境 http://www.linuxidc.com/Linux/2014-05/101774.htm

Qt 的詳細介紹:請點這裡
Qt 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved