转自:http://blog.csdn.net/liuxuezong/article/details/6928181
在组态软件中,要实现一些复杂的功能,我们都离不开脚本的实现。常见的脚本有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、运行结果
点击“加载脚本”按钮,然后点击“测试”(此时的标签已经被按钮填充)。