QT脚本在组态软件中实现动态功能的应用

时间:2021-09-19 19:18:01

转自:http://blog.csdn.net/liuxuezong/article/details/6928181

在组态软件中,要实现一些复杂的功能,我们都离不开脚本的实现。常见的脚本有VBScript、Jscript、Lua以及C语言脚本等,如果你的组态软件是基与QT4.6以上版本开发的话,那么QT的强大功能将为你展现出来。国内已经很多大型SCADA系统都使用QT了,这是因为很多厂家要支持跨平台,而QT与生俱来就是为此而诞生的。

    在常见的解决组态过程常常碰到复杂的问题,一般组态软件也就是通过Activex控件或类似控件形式自定义接口来解决需求,而有些组态软件通过VBScript封装的脚本引擎来提供接口。但这些首先解决不了跨平台和组件之间消息传递问题。希望此文能为您抛砖引玉提供一些思想。

1、首先我们创建一个最简单的工程 

QT脚本在组态软件中实现动态功能的应用

2、在对话框中添加一个按钮“加载脚本”和一个标签“测试”,标签的objectname=m_pBtnTest

QT脚本在组态软件中实现动态功能的应用

3、相关程序代码

Test.cpp代码

[cpp] view plaincopy
  1. #include "test.h"  
  2. #include <QMessageBox>  
  3.   
  4. QScriptValue myAdd(QScriptContext *context, QScriptEngine *engine)  
  5. {  
  6.     QScriptValue a = context->argument(0);  
  7.     QScriptValue b = context->argument(1);  
  8.     return a.toNumber() + b.toNumber();  
  9. }  
  10.   
  11. void ShowMessage(QString strText)  
  12. {  
  13.     QMessageBox::information(NULL, ("提示"), strText, ("确定(&O)"));  
  14. }  
  15.   
  16. QScriptValue ShowMessageFunc(QScriptContext *context, QScriptEngine *engine)  
  17. {      
  18.     QString strMsg = context->argument(0).toString();  
  19.     ShowMessage(strMsg);  
  20.     return engine->nullValue();  
  21. }  
  22.   
  23. test::test(QWidget *parent, Qt::WFlags flags)  
  24.     : QMainWindow(parent, flags)  
  25. {  
  26.     ui.setupUi(this);  
  27.     m_bLoad = false;  
  28.     pEngine = new QScriptEngine;  
  29.     QScriptValue fun = pEngine->newFunction(myAdd);  
  30.     pEngine->globalObject().setProperty("myAdd", fun);  
  31.   
  32.     //QScriptValue result = pEngine->evaluate("myAdd(2, 1)");  
  33.     QScriptValue funShowMsg = pEngine->newFunction(ShowMessageFunc);  
  34.     pEngine->globalObject().setProperty("ShowMessage", funShowMsg);  
  35.   
  36.     QScriptValue mainWin = pEngine->newQObject(this);  
  37.     pEngine->globalObject().setProperty("Form", mainWin);  
  38.   
  39.     // 假设图形上有一个图形按钮  
  40.      QRect qrect = ui.m_pbtnTest->geometry();  
  41.     QString strName = ui.m_pbtnTest->objectName();  
  42.     QString strTxt = ui.m_pbtnTest->text();  
  43.     QPushButton *pBtnTest = new QPushButton(strTxt, this);  
  44.     pBtnTest->setObjectName(strName);  
  45.     pBtnTest->setGeometry(qrect.left(), qrect.top(), qrect.width(), qrect.height());  
  46.     QScriptValue scriptButton = pEngine->newQObject(pBtnTest);  
  47.     pEngine->globalObject().setProperty(strName, scriptButton);  
  48.     bool bConnect1 = connect(ui.m_pbtnScript, SIGNAL(clicked()), this, SLOT(OnBtnScript()));  
  49. }   
  50.   
  51. test::~test()  
  52. {  
  53.     delete pEngine;  
  54.     pEngine = NULL;  
  55. }   
  56.   
  57. void test::OnBtnScript()   
  58. {  
  59.     // TODO: Add your control notification handler code here  
  60.     if (!m_bLoad)  
  61.     {  
  62.         QMessageBox::information(this, ("提示"), ("加载脚本!"), ("确定(&O)"));  
  63.     }  
  64.     else  
  65.     {  
  66.         return;  
  67.     }  
  68.     QString fileName = "test.js";  
  69.     QFile scriptFile(fileName);  
  70.     if (!scriptFile.open(QIODevice::ReadOnly))  
  71.     {  
  72.         QMessageBox::information(this"错误""打开文件失败!");  
  73.         return;  
  74.     }   
  75.   
  76.     QTextStream stream(&scriptFile);  
  77.     QString contents = stream.readAll();  
  78.     scriptFile.close();  
  79.   
  80.     pEngine->evaluate(contents, fileName);  
  81.     QScriptValue result = pEngine->evaluate("init()");  
  82.     if (pEngine->hasUncaughtException())  
  83.     {  
  84.         QMessageBox::information(this"错误", pEngine->uncaughtException().toString());  
  85.     }  
  86.     m_bLoad = true;  
  87. }  


Main.cpp代码

[cpp] view plaincopy
  1. #include "test.h"  
  2. #include <QtGui>  
  3. #include <QtGui/QApplication>   
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.   
  9.     QTextCodec *codec = QTextCodec::codecForName("GB2312");  
  10.   
  11.     QTextCodec::setCodecForLocale(codec);  
  12.   
  13.     QTextCodec::setCodecForCStrings(codec);  
  14.   
  15.     QTextCodec::setCodecForTr(codec);  
  16.   
  17.     test w;  
  18.   
  19.     w.show();  
  20.   
  21.     return a.exec();  
  22.   
  23. }  


 

Test.js脚本

[javascript] view plaincopy
  1. // JScript source code  
  2. var g_nStatus = 0;   
  3. function init()  
  4. {  
  5.     Form.m_pbtnTest.clicked.connect(OnBtnTest);  
  6. }  
  7.   
  8. function OnBtnTest()  
  9. {  
  10.    ShowMessage("QSA脚本测试123456789!"); // 这里将被调用显示  
  11. }  

4、运行结果

    点击“加载脚本”按钮,然后点击“测试”(此时的标签已经被按钮填充)。

 QT脚本在组态软件中实现动态功能的应用

QT脚本在组态软件中实现动态功能的应用