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代码
Main.cpp代码
Test.js脚本
4、运行结果
点击“加载脚本”按钮,然后点击“测试”(此时的标签已经被按钮填充)。
在常见的解决组态过程常常碰到复杂的问题,一般组态软件也就是通过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脚本在组态软件中实现动态功能的应用
- 动态实现幻灯片功能(应用filters.revealTrans)
- 动态加载Silverlight应用的dll文件(可实现插件功能)
- 使用Quartz动态实现应用的定时功能
- Qt的国际化示例程序以及步骤--实现Qt程序的动态切换语言功能
- Android应用自动更新功能的实现!!!软件更新,自动下载,安装
- 动态加载Silverlight应用的dll文件(可实现插件功能)(转)
- QtQuick桌面应用开发指导 3)实现UI和功能_B 4)动态管理Note对象_A
- Android应用之个人应用软件开发(3)【SQLite数据库及理财功能实现】
- YUI3的动态加载脚本功能实现
- Android App应用调用已安装市场,进行软件评分的功能代码实现
- Qt窗口组件实现动态背景功能
- 基于Qt的组态监控软件实现以及分析(转)
- 动态配置脚本实现之 flex,yacc应用
- 基于python脚本实现软件的注册功能(机器码+注册码机制)
- Android应用自动更新功能的实现!!!软件更新,自动下载,安装
- 动态加载Silverlight应用的dll文件(可实现插件功能)
- Struts1应用、实现简单计算器、使用DispatchAction、显示友好的报错信息、使用动态Form简化开发
- linux shell 脚本实现tcp/upd协议通讯(重定向应用)