zoukankan      html  css  js  c++  java
  • Qt之QtScript(一)

    C++和JavaScript相互通信。今天就学习QtScript模块吧。

        Qt 包含完全集成的 ECMA 标准脚本引擎。Qt Script 集成了 QObject,为脚本提供了 Qt 的信号与槽 (Signals & Slots) 机制,可在 C++ 和脚本之间进行集成。 脚本支持可使开发事半功倍,QtScript提供脚本错误报告,用户可用自己的脚本跟踪程序缺陷.

       下面是一个简单的hello程序。

       

    [cpp] view plaincopy
     
    1. //main.cpp  
    2. #include <QtGui/QApplication>  
    3. #include <QMessageBox>  
    4. #include <QtScript/QtScript>  
    5. #include <QPushButton>  
    6. #include "mainwindow.h"  
    7.   
    8. int main(int argc, char *argv[])  
    9. {  
    10.     Q_INIT_RESOURCE(helloscript);  
    11.     QApplication app(argc, argv);  
    12.     QScriptEngine engine;  
    13.   
    14.     //国际化  
    15.     QTranslator translator;  
    16.     translator.load("helloscript_la");  
    17.     app.installTranslator(&translator);  
    18.     engine.installTranslatorFunctions();  
    19.   
    20.     QPushButton button;  
    21.     QScriptValue scriptButton = engine.newQObject(&button);//生成C++对象的代理脚本对象  
    22.     engine.globalObject().setProperty("button", scriptButton);//将对象注册到javascript  
    23.   
    24.     //读取js文件  
    25.     QString fileName(":/helloscript.js");  
    26.     QFile scriptFile(fileName);  
    27.     scriptFile.open(QIODevice::ReadOnly);  
    28.     QTextStream stream(&scriptFile);  
    29.     QString contents = stream.readAll();  
    30.     scriptFile.close();  
    31.   
    32.     QScriptValue result = engine.evaluate(contents, fileName);//执行脚本  
    33.     if(result.isError()) {//解析js文件是否有错误  
    34.         QMessageBox::critical(0, "Hello Script",  
    35.                               QString::fromLatin1("%0:%1: %2")  
    36.                               .arg(fileName)//文件名  
    37.                               .arg(result.property("lineNumber").toInt32())//错误行号  
    38.                               .arg(result.toString()));//错误信息  
    39.         return -1;  
    40.     }  
    41.     return app.exec();  
    42. }  

      

    [javascript] view plaincopy
     
    1. //helloscript.js  
    2. button.text = qsTr('Hello World');//note that the qTr() function is used to allow for translation  
    3. button.styleSheet = 'font-style: italic; color: #12FF12';  
    4. button.show();//调用show()槽函数  
    5. button.clicked.connect(  
    6.     function(){  
    7.        print('Hello QtScript');  
    8.     }  
    9. );  

    记住还需要在.pro文件中加入:QT       += script

        1、QScriptEngine类为程序提供一个嵌入式脚本环境。一个应用程序中可以添加多个脚本引擎;每一个引擎都是一个轻量级自包含的虚拟机。通过调用脚本引擎的evaluate()函数可以执行脚本.

       

    [c-sharp] view plaincopy
     
    1. QScriptEngine engine;  
    2. QScriptValue result = engine.evaluate("(3*2)-1");  
    3. qDebug() << "Result: " << result.toInt32();  

        

      

    [cpp] view plaincopy
     
    1. QScriptEngine engine;  
    2. QScriptValue func = engine.evaluate("(function(a, b) { return a+b;})");  
    3. QScriptValueList args;  
    4. args << 1 << 2;  
    5. QScriptValue result = func.call(QScriptValue(), args);  
    6. qDebug() << "Result: " << result.toInt32();  

        2、QScriptValue是一个Qt Script数据类型的容器,支持ECMA-262定义的类型,如:

         原始数据类型:Undefined,Null,Boolean,Number,String,对象类型。

         另外Qt Script还内建支持QVariant,QObject和QMetaObject.

          >>对于基对象(object-based)类型(包括Date和RegExp),使用QScriptEngine对象的newT()函数(如QScriptEngine::newObject())创建一个你期望的QScriptValue类型。

          >>对于原始数据类型,直接使用QScriptValue构造函数加载。

          isT()方法能够被用来测试一个值是否是你确定的数据类型。toT()方法用来将QScriptValue转换成其他类型。当然你也可以用qscriptvalue_cast()方法.

  • 相关阅读:
    洛谷 P1005 矩阵取数游戏 (区间dp+高精度)
    洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)
    洛谷 P1052 过河 (离散化+dp)
    洛谷 P1541 乌龟棋 (四维费用背包)
    洛谷 P1736 创意吃鱼法
    矩阵旋转模板
    洛谷 P1855 榨取kkksc03 (二维费用背包)
    洛谷 P1417 烹调方案 (01背包拓展)
    关于结构体的PPT
    子进程自父进程继承什么或未继承什么
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4026884.html
Copyright © 2011-2022 走看看