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

本文介绍在基于QT4.6以上版本的组态软件中如何通过脚本实现复杂功能,包括创建简单工程、添加控件、编写脚本函数以及解决跨平台和组件间消息传递问题。通过实例展示了如何利用脚本如VBScript、Jscript、Lua及C语言进行功能扩展,并提供了关键代码片段。最后,实现了通过加载脚本实现特定功能的交互体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在组态软件中,要实现一些复杂的功能,我们都离不开脚本的实现。常见的脚本有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 code
var g_nStatus = 0; 
function init()
{
    Form.m_pbtnTest.clicked.connect(OnBtnTest);
}

function OnBtnTest()
{
   ShowMessage("QSA脚本测试123456789!"); // 这里将被调用显示
}

4、运行结果

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

 

基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能。 基于Qt实现组态软件运行时系统原型:1. 具有模块化的图元代码设计,及基于该设计实现的组态编辑器动态生成Qt组态画面代码功能;2. 使用主从同步模式,设计及实现j集散控制系统数据区同步协议;3. 接入时序数据库完成对工业数据采集及运行时系统仿真功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值