V8 初次接触(Qt5) 1+1=2 博客频道 CSDN.NET

摘要:
V8初始接触-1+1=2-博客渠道CSDN与NETV8的初始接触类别:QtQt52011-09-0318:411881人阅读评论、收集报告,在Qt5中,javascript与C++一样,已经成为Qt的一级公民;Qt选择的javascript引擎是V8.V8输入Qtbasehttps://bugreports.qt.nokia.com/browse/QTBUG-20963https://bugreports.qt.nokia.com/browse/QTBUG20893V8已作为qtbase中的独立模块从qtdeclarative模块中删除。" ");Handle<Script>Script=脚本::编译;Handle<Value>result=script-˃Run();context.Dispose();字符串::AsciiValueascii;printf;返回。exec();}hello.proQT+=v8 privateCONFIG+=consoleSOURCES+=main。CPP嗯,QtScriptQtScript可以通过直接运行qmake和make来更改。最早的变化是QtScriptforApplications正式包含了Qt4.3中的QtScript模块Qt4.6,QtScript由JavaScript Core重写。因此,我们正在评估是否支持JS类型正则表达式作为Qt5中的默认语法。

V8 初次接触(Qt5) - 1+1=2 - 博客频道 - CSDN.NET


分类:
Qt
Qt5

2011-09-03 18:41
1881人阅读
评论(4)
收藏
举报

在Qt5中,javascript 和 C++一样,成了Qt中的一等公民;而Qt选中的javascript引擎则是 V8。

看来,有必要简单看看这个东西了。

V8

V8是什么?

  • 项目主页:http://code.google.com/p/v8/

  • V8 是Google开发的开源的JavaScript引擎。

  • V8 采用C++编写,且用于Google Chrome浏览器
  • 据说,比用于IE的JScript,用于Firefox的SpiderMonkey,以及用于Safari的JavaScriptCore速度更快

构建V8

和大部分开源项目一样,在linux下比较方便(而在Windows下则有些复杂)。

只需要下载源码,然后在源码目录下,执行:

scons

即可得到 libv8.a

例子

一个在C++中嵌入V8的例子:

#include <v8.h>
using namespace v8;
int main()
{
  HandleScope handle_scope;

  Persistent<Context> context = Context::New();
  Context::Scope context_scope(context);
  Handle<String> source = String::New("'Hello' + ', World!'");
  Handle<Script> script = Script::Compile(source);
  Handle<Value> result = script->Run();
  context.Dispose();

  String::AsciiValue ascii(result);
  printf("%s\n", *ascii);
  return 0;
}

这堆代码真难看懂,幸好,编译倒还简单:

g++ dbzhang.cpp -I./include libv8.a -lpthread

Qt5

当前的Qt4.7中,Qt 中有两套 JavaScript 引擎

  • Qt WebKit 中有一个JavaScriptCore副本

  • Qt Script 中有另一个JavaScriptCore副本

  • Qt Script 本身被用作Qt Quick的JavaScript引擎

目标是:为Qt WebKit、Qt Script、QML提供一个统一引擎。

V8进入qtbase

V8 已经从 qtdeclarative 模块内部移出,作为qtbase中的一个独立模块。下一步就是将QJSEngine和QDeclarativeEngine移动到QtCore模块?

没碰过qml,不过可以先看看:如何在Qt5的C++程序中嵌入V8?

  • main.cpp
#include <QtCore/QCoreApplication>
#include <private/v8.h>
using namespace v8;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    HandleScope handle_scope;

    Persistent<Context> context = Context::New();
    Context::Scope context_scope(context);
    Handle<String> source = String::New("'Hello' + ', World!'");
    Handle<Script> script = Script::Compile(source);
    Handle<Value> result = script->Run();
    context.Dispose();

    String::AsciiValue ascii(result);
    printf("%s\n", *ascii);

    return a.exec();
}
  • hello.pro
QT       += v8-private
CONFIG   += console
SOURCES += main.cpp

恩,直接运行 qmake、make 即可

QtScript

QtScript也是几经变化

  • 最早是:Qt Script for Applications (QSA)
  • 从 Qt4.3 开始正式包含一个QtScript模块

  • Qt4.6时,QtScript采用JavaScriptCore进行了重写。

  • 现在,在评估是否可以用V8作为引擎...

但,从这儿

可以看出

  • QtScript 不太可能移植到V8之上了

  • 准备引入一套新的script API接口??

QRegExp

文中说,QtCore的中的QRegExp引擎已经相当老了,而V8提供了性能更好的正则表达式引擎。所以在评估是否要支持JS类型的正则表达式并作为Qt5中默认的语法。

不过按照Thiago Macieira 今天在邮件列表中的说法,这个应该是被否决了。摘录如下:

  • Lars and I had discussed the idea of using V8's RE engine to replace QRegExp. But after investigating V8, I came to the conclusion that this idea was not acceptable.
    The advantage of that would be that the C++ and QML sides of Qt would have access to the same RE syntax. And we wouldn't need two RE engines in memory.
    PCRE looks more likely to be the replacement for QRegExp.

v8源码

  • 源码默认放置在 qtbase/src/3rdparty/v8/
  • 也可放置到其他位置,通过环境变量 V8DIR 指定

v8官方采用的构建系统是scons,而在Qt中,使用的是qmake。相关的工程文件在

  • qtbase/src/v8

不过从工程文件v8.pri可以看出,构建时需要python的参与

v8_js2c.commands = python $V8DIR/tools/js2c.py $V8_GENERATED_SOURCES_DIR/libraries.cpp $V8_GENERATED_SOURCES_DIR/libraries-empty.cpp CORE
v8_js2c.commands += $V8SRC/macros.py ${QMAKE_FILE_IN}
v8_js2c.output = $V8_GENERATED_SOURCES_DIR/libraries.cpp
v8_js2c.input = V8_LIBRARY_FILES
v8_js2c.variable_out = SOURCES
v8_js2c.dependency_type = TYPE_C
v8_js2c.depends = $V8DIR/tools/js2c.py $V8SRC/macros.py
v8_js2c.CONFIG += combine
v8_js2c.name = generating[v8] ${QMAKE_FILE_IN}
silent:v8_js2c.commands = @echo generating[v8] ${QMAKE_FILE_IN} && $v8_js2c.commands
QMAKE_EXTRA_COMPILERS += v8_js2c

一点牢骚

最后,抱怨一下,目前Qt5的东西真乱,都看不懂

libQtAddOnGallery.so.5.0.0          libQtPublishSubscribe.so.5.0.0
libQtCLucene.so.5.0.0               libQtQuick1.so.5.0.0
libQtCore.so.5.0.0                  libQtQuickTest.so.5.0.0
libQtDBus.so.5.0.0                  libQtScript.so.5.0.0
libQtDeclarative.so.5.0.0           libQtScriptTools.so.5.0.0
libQtDesignerComponents.so.5.0.0    libQtSensors.so.5.0.0
libQtDesigner.so.5.0.0              libQtServiceFramework.so.5.0.0
libQtFeedback.so.5.0.0              libQtSql.so.5.0.0
libQtGui.so.5.0.0                   libQtSvg.so.5.0.0
libQtHelp.so.5.0.0                  libQtSystemInfo.so.5.0.0
libQtLocation.so.5.0.0              libQtTest.so.5.0.0
libQtMultimediaKit.so.5.0.0         libQtV8.so.5.0.0
libQtMultimediaKitWidgets.so.5.0.0  libQtXmlPatterns.so.5.0.0
libQtNetwork.so.5.0.0               libQtXml.so.5.0.0
libQtOpenGL.so.5.0.0

还没编译全呢,就这么多了。而且许多东西似乎还要陆续拆分出来...

参考

免责声明:文章转载自《V8 初次接触(Qt5) 1+1=2 博客频道 CSDN.NET》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python torch 解决OSError: [WinError 126] 找不到指定的模块。 Error loading "D:Anaconda3libsite-packages orchlibasmjit.dll" or one of its dependencies.(安装完torch模块后出现找不到指定模块的问题)算法竞赛入门经典 暴力求解法 7.1简单枚举 最大乘积下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 菊花加载工具类

先看看实现效果图 1.首先自定义一个类继承系统ProgressDialog /** * Created by hanbao0928 on 2018/11/1. */ public class DialogUtils extends ProgressDialog { public DialogUtils(Context context)...

Android实现开机自动运行程序(转)

  有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service。怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以“Don''t call me, I''ll call you back!”总结Android框架,真是说到点子上了。理解这句话的含义,许多有关Android平台上实现某种功能的问题,都能迎刃而解。使用场景:...

《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO

1、前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑。但是在ArcGIS Runtime SDK for Android的版本中并没有提供类似的功能,实现过程相对较复杂。(10.2.8及以下版本需要用户自定义扩展...

spring获取webapplicationcontext,applicationcontext几种方法详解[转载]

方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 或者通过classpath 路径获取 ApplicationCont...

WePY 小程序授权点击取消授权失败的方案

今天看到一个微信小程序 wepy 框架的获取用户信息授权, 收录下,方便以后用的上。 在wepy里使用进行小程序页面授权,里面包含了用户点击取消的重新授权方案: //auth.js /* * @Author: Porco_Mar * @Date: 2018-04-11 15:49:55 * @Last Modified by: Porco_Mar...

Python+Selenium笔记(十五)调用JS

(一)方法 方法 简单说明 execute_async_script(script, args) 异步执行JS代码 script:被执行的JS代码 args:js代码中的任意参数 execute_script(script, args) 同步执行JS代码 script:被执行的JS代码 args:js代码中的任意参数 (二)示例 f...