您的位置:首页 > 编程语言 > Qt开发

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

2011-11-02 13:38 681 查看
在组态软件中,要实现一些复杂的功能,我们都离不开脚本的实现。常见的脚本有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、运行结果

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: