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

来源:互联网 发布:淘宝商品删除怎么恢复 编辑:程序博客网 时间:2024/06/12 01:00
      在组态软件中,要实现一些复杂的功能,我们都离不开脚本的实现。常见的脚本有VBScript、Jscript、Lua以及C语言脚本等,如果你的组态软件是基与QT4.6以上版本开发的话,那么QT的强大功能将为你展现出来。国内已经很多大型SCADA系统都使用QT了,这是因为很多厂家要支持跨平台,而QT与生俱来就是为此而诞生的。

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

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

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

3、相关程序代码

Test.cpp代码

#include "test.h"#include <QMessageBox>QScriptValue myAdd(QScriptContext *context, QScriptEngine *engine){    QScriptValue a = context->argument(0);    QScriptValue b = context->argument(1);    return a.toNumber() + b.toNumber();}void ShowMessage(QString strText){    QMessageBox::information(NULL, ("提示"), strText, ("确定(&O)"));}QScriptValue ShowMessageFunc(QScriptContext *context, QScriptEngine *engine){        QString strMsg = context->argument(0).toString();    ShowMessage(strMsg);    return engine->nullValue();}test::test(QWidget *parent, Qt::WFlags flags)    : QMainWindow(parent, flags){    ui.setupUi(this);    m_bLoad = false;    pEngine = new QScriptEngine;    QScriptValue fun = pEngine->newFunction(myAdd);    pEngine->globalObject().setProperty("myAdd", fun);    //QScriptValue result = pEngine->evaluate("myAdd(2, 1)");    QScriptValue funShowMsg = pEngine->newFunction(ShowMessageFunc);    pEngine->globalObject().setProperty("ShowMessage", funShowMsg);    QScriptValue mainWin = pEngine->newQObject(this);    pEngine->globalObject().setProperty("Form", mainWin);    // 假设图形上有一个图形按钮     QRect qrect = ui.m_pbtnTest->geometry();    QString strName = ui.m_pbtnTest->objectName();    QString strTxt = ui.m_pbtnTest->text();    QPushButton *pBtnTest = new QPushButton(strTxt, this);    pBtnTest->setObjectName(strName);    pBtnTest->setGeometry(qrect.left(), qrect.top(), qrect.width(), qrect.height());    QScriptValue scriptButton = pEngine->newQObject(pBtnTest);    pEngine->globalObject().setProperty(strName, scriptButton);    bool bConnect1 = connect(ui.m_pbtnScript, SIGNAL(clicked()), this, SLOT(OnBtnScript()));} test::~test(){    delete pEngine;    pEngine = NULL;} void test::OnBtnScript() {    // TODO: Add your control notification handler code here    if (!m_bLoad)    {        QMessageBox::information(this, ("提示"), ("加载脚本!"), ("确定(&O)"));    }    else    {        return;    }    QString fileName = "test.js";    QFile scriptFile(fileName);    if (!scriptFile.open(QIODevice::ReadOnly))    {        QMessageBox::information(this, "错误", "打开文件失败!");        return;    }     QTextStream stream(&scriptFile);    QString contents = stream.readAll();    scriptFile.close();    pEngine->evaluate(contents, fileName);    QScriptValue result = pEngine->evaluate("init()");    if (pEngine->hasUncaughtException())    {        QMessageBox::information(this, "错误", pEngine->uncaughtException().toString());    }    m_bLoad = true;}


Main.cpp代码

#include "test.h"#include <QtGui>#include <QtGui/QApplication> int main(int argc, char *argv[]){    QApplication a(argc, argv);    QTextCodec *codec = QTextCodec::codecForName("GB2312");    QTextCodec::setCodecForLocale(codec);    QTextCodec::setCodecForCStrings(codec);    QTextCodec::setCodecForTr(codec);    test w;    w.show();    return a.exec();}


 

Test.js脚本

// JScript source codevar g_nStatus = 0; function init(){    Form.m_pbtnTest.clicked.connect(OnBtnTest);}function OnBtnTest(){   ShowMessage("QSA脚本测试123456789!"); // 这里将被调用显示}

4、运行结果

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

 

原创粉丝点击