Qt文档阅读笔记-编写应用脚本解析与实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/82762445

目录

官方解析

博主例子


官方解析

编写应用脚本

Qt提供了JavaScript脚本对应用程序的支持。下面将全方位说明JavaScript在Qt中的应用。

Scripting Classes
如下的类为Qt应用程序添加脚本的功能。
QJSEngine:提供运行JavaScript代码的环境
QJSValue:充当Qt/JavaScrpit数据类型的容器
QJSValueIterator:QJSvalue的Java风格的迭代器

基础用法
评估脚本代码,先要创建一个QJSEngine对象,并且调用evaluate()这个函数,通过传递txt的脚本代码进行评估。

 QJSEngine engine;
  qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();


返回值将是评估的结果,返回值为QJSValue这对象;这个返回值可以转换为标准C++或者Qt的类型(QVariant)。
通过使用QJSEngine对象注册自定义属性,可以让这个自定义属性在脚本中运行。通过QJSEngine的全局对象可以设置属性,这种骚操作很简单,如下代码:

 engine.globalObject().setProperty("foo", 123);
  qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();


这里面的自定义属性已经在script环境中了,因此他可以脚本中生效。

把一个QObject对象放入Script引擎中
任何QObject派生类的实例都能放到script里面使用。
当QObject作为参数被QJSEngine::newQObject()调用时,Qt脚本包装器对象被创建,这个对象能够用来制作QObject的信号,槽,各种属性,以及继承树。

举一个栗子,一个QObject的派生类对象可以在脚本代码内命名为"myObject"

engine.globalObject().setProperty("foo", 123);
  qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();


这里将会创建一个全局的变量,变量名为myObject,并且是在脚本环境中。这个变量充当了底层C++对象的代理。注意,脚本的名称可以是任意的名称等,他与Qbject::objectName()无关


博主例子

对上面例子的实现

源码如下:

myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>

class MyObject:public QObject{
    Q_OBJECT
public:
    MyObject(QObject *parent=0):QObject(parent){
        m_myValue=9999;
    }
    ~MyObject(){}
    int m_myValue;
};

#endif // MYOBJECT_H

main.cpp

#include <QJSEngine>
#include <QObject>
#include <QApplication>
#include <QJSValue>
#include <QDebug>
#include "myobject.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QJSEngine engine;
    qDebug()<<"The value is "<<engine.evaluate("1+2").toNumber();
    engine.globalObject().setProperty("foo",123);
    qDebug()<<"foo times two is "<<engine.evaluate("foo*2").toNumber();

    QObject *someObject=new MyObject;
    QJSValue objectvalue=engine.newQObject(someObject);
    engine.globalObject().setProperty("myObject",objectvalue);
    qDebug()<<"QObject *someObject pointer address is "<<someObject;
    qDebug()<<"Engine.evaluate(\"myObject\"):"<<engine.evaluate("myObject").toQObject();
    MyObject *myObject=qobject_cast<MyObject*>(engine.evaluate("myObject").toQObject());
    qDebug()<<"The value is "<<myObject->m_myValue;
    return a.exec();
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/82762445
今日推荐