Qt之javascript(QJSEngine)

Qt之javascript(QJSEngine)

c++调用js

  • 调用js函数,QJSValue::call()

        QJSValue fun = myEngine.evaluate("(function(a, b) { return a + b; })");
        QJSValueList args;
        args << 1 << 2;
        QJSValue threeAgain = fun.call(args);
    
  • 执行脚本 QJSEngine::evaluate

      void QJSEngineDemo::loadJSFiles( const QString& JSPath)
      {
          QDir jsDir(QCoreApplication::applicationDirPath());
          jsDir.cd("js");
          QStringList jsFiles = jsDir.entryList(QStringList("*.js"),QDir::Files);
          qDebug() << jsFiles;
          foreach (QString file,jsFiles) {
              QString fileName = jsDir.absoluteFilePath(file);
              QFile scriptFile(fileName);
      
              if (!scriptFile.open(QIODevice::ReadOnly)){
                  qDebug()<<"File open fail:"<<scriptFile.errorString();
                  continue;
              }
              QTextStream stream(&scriptFile);
              QString contents = stream.readAll();
              scriptFile.close();
      
              QJSValue result = m_pJSEngin->evaluate(contents,fileName);
              printException(result);
          }
      }
      //调用js函数
      //QJSValue jsObj = m_pJSEngin->globalObject();
      //QJSValue result = jsObj.property(fun).call(QJSValueList()<<22<< 33);
      //qDebug() << "result" << result.toVariant();
      //printException(result);
    

js中调用c++

  • 第一种方法,在C++中创建对象,用newQObject代理脚本对象,脚本就可以访问该对象

        QPushButton *button = new QPushButton;
        QJSValue scriptButton = myEngine.newQObject(button);
        myEngine.globalObject().setProperty("button", scriptButton);
      
        myEngine.evaluate("button.checkable = true");
      
        qDebug() << scriptButton.property("checkable").toBool();
        scriptButton.property("show").call(); // call the show() slot
    
  • 第二种方法,直接将对象暴露给js,然js自己去创建对象

      Constructors exposed to the meta-object system (using Q_INVOKABLE) can be called from the script to create a new QObject instance with JavaScriptOwnership. For example, given the following class definition:
      	  class MyObject : public QObject
        {
            Q_OBJECT
      
        public:
            Q_INVOKABLE MyObject() {}
        };
      //The staticMetaObject for the class can be exposed to JavaScript like so:
        QJSValue jsMetaObject = engine.newQMetaObject(&MyObject::staticMetaObject);
        engine.globalObject().setProperty("MyObject", jsMetaObject);
      
      //Instances of the class can then be created in JavaScript:
        engine.evaluate("var myObject = new MyObject()");
    

debugger 的使用

脚本异常捕获

	// Error
	QJSValue errorValue = jsEngine->evaluate("...");
	if (errorValue.isError())
	{
	    qDebug() << "Error!";
	    qDebug() << errorValue.property("name").toString() << ", " \
	             << errorValue.property("message").toString();
	    qDebug() << errorValue.property("lineNumber").toInt();
	}
  • 下面是一些可使用的属性:
  • name : 名字
  • message :错误的信息
  • fileName : 文件名,evaluate 函数也可以指定一个文件名,它的作用也仅用于次。如果想加载一个文件运行,则必须加载到内存中,然后将文件的内容传递到该函数中。
  • lineNumber :错误行号
  • stack :调用堆栈。

Js与Qt之间传参

  1. 传数组

     QJSValue jsObj = m_pJSEngin->globalObject();
     QJSValue jsArray = m_pJSEngin->newArray(3);
     for (int i = 0; i < 3; ++i) {
         jsArray.setProperty(i, "data"+ QString::number(i));
     }
     QJSValue result = jsObj.property("testArray").call(QJSValueList()<<jsArray);
    
  2. 传对象
    QJSValue jsObj = m_pJSEngin->globalObject();

     QJSValue myObject = m_pJSEngin->newObject();
     QJSValue myOtherObject = m_pJSEngin->newObject();
     myObject.setProperty("myChild", myOtherObject);
     myObject.setProperty("text", "John Doe");
     QJSValue result = jsObj.property("testStruct").call(QJSValueList()<<myObject);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值