`

WebKit -- qt javascript

 
阅读更多

在 QT 目录中打开下面的文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/runtime.cpp

有下面几行:

  1. #ifPLATFORM(QT)
  2. caseInstance::QtLanguage:{
  3. newInstance=Bindings::QtInstance::getQtInstance((QObject*)nativeInstance,rootObject);
  4. break;
  5. }
  6. #endif

这就表明,可以用 QtLanguage 来编写自定义的 javascript 对象。这里也有几个别的 Language,也就是说可以用它们来编写扩展 javascript 对象,应该也能自定义自己的 Language。既然是用 qt 的 GUI,使用 QtLanguage 应该是最合适的。

先打开它的例子文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/testqtbindings.cpp

可以看到其中有这样几行:

  1. staticcharcode[]=
  2. "myInterface.foo();/n"
  3. "myInterface.testString=/"Hello/";/n"
  4. "str=myInterface.testString;/n"
  5. "myInterface.testInt=10;/n"
  6. "i=myInterface.testInt;/n";

这就是说,testqtbindings.cpp 的内容可以对下面的 javascript 进行解析:

  1. myInterface.foo();
  2. myInterface.testString="Hello";
  3. varstr=myInterface.testString;
  4. myInterface.testInt=10;
  5. vari=myInterface.testInt;

我想定义自己的 javascript,比如在 myInterface 对象前面加上一个 CSDN 对象:

  1. CSDN.myInterface.foo();
  2. CSDN.myInterface.testString="Hello";
  3. varstr=CSDN.myInterface.testString;

这件事情本来很简单,可是就象 CSDN.myInterface.foo() 这样,连接 CSDN 和 myInterface 两个对象的事情,在网上(中文和英文网站)找了半天没找着,结果还是我自己想到的。

1. 在原来的文件中再添加一个 MyCSDNObject 对象:

  1. classMyCSDNObject:publicQObject
  2. {
  3. Q_OBJECT
  4. Q_PROPERTY(QStringtestStringREADtestStringWRITEsetTestString)
  5. Q_PROPERTY(inttestIntREADtestIntWRITEsetTestInt)
  6. //添加QObject成员作为CSDN对象的属性,映射到testMyInterface函数上
  7. Q_PROPERTY(QObject*myInterfaceREADtestMyInterface)
  8. public:
  9. MyCSDNObject():QObject(0),integer(0),m_myObject(NULL){}
  10. voidsetTestString(constQString&str){
  11. qDebug()<<"calledsetTestString"<<str;
  12. string=str;
  13. }
  14. voidsetTestInt(inti){
  15. qDebug()<<"calledsetTestInt"<<i;
  16. integer=i;
  17. }
  18. QStringtestString()const{
  19. qDebug()<<"calledtestString"<<string;
  20. returnstring;
  21. }
  22. inttestInt()const{
  23. qDebug()<<"calledtestInt"<<integer;
  24. returninteger;
  25. }
  26. //在这里返回一个QObject对象
  27. QObject*testMyInterface()
  28. {
  29. if(m_myObject==NULL)
  30. m_myObject=newMyObject();
  31. returnm_myObject;
  32. }
  33. QStringstring;
  34. intinteger;
  35. //声名一个QObject对象
  36. MyObject*m_myObject;
  37. publicslots:
  38. voidfoo(){qDebug()<<"fooinvoked";}
  39. };


这样 MyCSDNObject 和 MyObject 这样两个对象就可以连起来了,成为 CSDN.testMyInterface


2. 修改一下创建的根对象的名字

  1. global->put(exec,Identifier("CSDN"),Instance::createRuntimeObject(Instance::QtLanguage,(void*)myObject));


这样就可以了。这是个测试程序,需要把这些测试代码添加到 WebKit 浏览器中。打开文件:
./src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
把刚才的 MyObject 类和 MyCSDNObject 类在其中声名一下,然后添加CSDN 根对象作为QWebFrame 类的私有成员,如下所示:

  1. classMyObject:publicQObject
  2. {
  3. Q_OBJECT
  4. //省略...
  5. };
  6. classMyCSDNObject:publicQObject
  7. {
  8. Q_OBJECT
  9. //省略...
  10. };
  11. classQWEBKIT_EXPORTQWebFrame:publicQObject
  12. {
  13. Q_OBJECT
  14. Q_PROPERTY(qrealtextSizeMultiplierREADtextSizeMultiplierWRITEsetTextSizeMultiplier)
  15. Q_PROPERTY(QStringtitleREADtitle)
  16. Q_PROPERTY(QUrlurlREADurlWRITEsetUrl)
  17. Q_PROPERTY(QIconiconREADicon)
  18. Q_PROPERTY(QSizecontentsSizeREADcontentsSize)
  19. private:
  20. QWebFrame(QWebPage*parent,QWebFrameData*frameData);
  21. QWebFrame(QWebFrame*parent,QWebFrameData*frameData);
  22. ~QWebFrame();
  23. //声名CSDN根对象
  24. MyCSDNObject*m_csdn;
  25. public:
  26. //以下省略...
  27. };


打开 qwebframe.cpp 文件,在 QWebFrame 的构造函数中创建 CSDN 根对象。

  1. QWebFrame::QWebFrame(QWebPage*parent,QWebFrameData*frameData)
  2. :QObject(parent)
  3. ,d(newQWebFramePrivate)
  4. {
  5. d->page=parent;
  6. d->init(this,parent->d->page,frameData);
  7. //在这里创建CSDN根对象
  8. {
  9. KJS::Bindings::RootObject*root=d->frame->bindingRootObject();
  10. KJS::ExecState*exec=root->interpreter()->globalExec();
  11. KJS::JSObject*global=root->interpreter()->globalObject();
  12. m_csdn=newMyCSDNObject();
  13. global->put(exec,KJS::Identifier("CSDN"),KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage,(void*)m_csdn,root));
  14. }
  15. if(!frameData->url.isEmpty()){
  16. ResourceRequestrequest(frameData->url,frameData->referrer);
  17. d->frame->loader()->load(request,frameData->name);
  18. }
  19. }

在 QWebFrame 的析构函数中删除 CSDN 根对象

  1. QWebFrame::~QWebFrame()
  2. {
  3. if(d->frame&&d->frame->loader()&&d->frame->loader()->client())
  4. static_cast(d->frame->loader()->client())->m_webFrame=0;
  5. if(m_csdn)
  6. {
  7. deletem_csdn;
  8. m_csdn=NULL;
  9. }
  10. deleted;
  11. }

再手工编写一个 HTML 测试页 csdn1.htm,内容如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<script language="JavaScript">
<!--
function test()
{
CSDN.myInterface.foo();
CSDN.myInterface.testString = "Hello QtWebKit JavaScript";
var str = CSDN.myInterface.testString;
document.getElementById("txtMessage").innerHTML = str;
}
//-->
</script>
</head>

<body>
<p><a href="javascript:test();">test qt-webkit javascript</a></p>
<p id="txtMessage"></p>
</body>
</html>

编译并运行WebKit 浏览器,让它打开刚才的测试页 csdn1.htm,点击上面的 test qt-webkit javascript 链接,可以得到下面的效果:

上面的 Hello QtWebKit JavaScript 就是 javascript 设置的 CSDN.myInterface.testString内容。

在 QT 目录中打开下面的文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/runtime.cpp

有下面几行:

  1. #ifPLATFORM(QT)
  2. caseInstance::QtLanguage:{
  3. newInstance=Bindings::QtInstance::getQtInstance((QObject*)nativeInstance,rootObject);
  4. break;
  5. }
  6. #endif

这就表明,可以用 QtLanguage 来编写自定义的 javascript 对象。这里也有几个别的 Language,也就是说可以用它们来编写扩展 javascript 对象,应该也能自定义自己的 Language。既然是用 qt 的 GUI,使用 QtLanguage 应该是最合适的。

先打开它的例子文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/testqtbindings.cpp

可以看到其中有这样几行:

  1. staticcharcode[]=
  2. "myInterface.foo();/n"
  3. "myInterface.testString=/"Hello/";/n"
  4. "str=myInterface.testString;/n"
  5. "myInterface.testInt=10;/n"
  6. "i=myInterface.testInt;/n";

这就是说,testqtbindings.cpp 的内容可以对下面的 javascript 进行解析:

  1. myInterface.foo();
  2. myInterface.testString="Hello";
  3. varstr=myInterface.testString;
  4. myInterface.testInt=10;
  5. vari=myInterface.testInt;

我想定义自己的 javascript,比如在 myInterface 对象前面加上一个 CSDN 对象:

  1. CSDN.myInterface.foo();
  2. CSDN.myInterface.testString="Hello";
  3. varstr=CSDN.myInterface.testString;

这件事情本来很简单,可是就象 CSDN.myInterface.foo() 这样,连接 CSDN 和 myInterface 两个对象的事情,在网上(中文和英文网站)找了半天没找着,结果还是我自己想到的。

1. 在原来的文件中再添加一个 MyCSDNObject 对象:

  1. classMyCSDNObject:publicQObject
  2. {
  3. Q_OBJECT
  4. Q_PROPERTY(QStringtestStringREADtestStringWRITEsetTestString)
  5. Q_PROPERTY(inttestIntREADtestIntWRITEsetTestInt)
  6. //添加QObject成员作为CSDN对象的属性,映射到testMyInterface函数上
  7. Q_PROPERTY(QObject*myInterfaceREADtestMyInterface)
  8. public:
  9. MyCSDNObject():QObject(0),integer(0),m_myObject(NULL){}
  10. voidsetTestString(constQString&str){
  11. qDebug()<<"calledsetTestString"<<str;
  12. string=str;
  13. }
  14. voidsetTestInt(inti){
  15. qDebug()<<"calledsetTestInt"<<i;
  16. integer=i;
  17. }
  18. QStringtestString()const{
  19. qDebug()<<"calledtestString"<<string;
  20. returnstring;
  21. }
  22. inttestInt()const{
  23. qDebug()<<"calledtestInt"<<integer;
  24. returninteger;
  25. }
  26. //在这里返回一个QObject对象
  27. QObject*testMyInterface()
  28. {
  29. if(m_myObject==NULL)
  30. m_myObject=newMyObject();
  31. returnm_myObject;
  32. }
  33. QStringstring;
  34. intinteger;
  35. //声名一个QObject对象
  36. MyObject*m_myObject;
  37. publicslots:
  38. voidfoo(){qDebug()<<"fooinvoked";}
  39. };


这样 MyCSDNObject 和 MyObject 这样两个对象就可以连起来了,成为 CSDN.testMyInterface


2. 修改一下创建的根对象的名字

  1. global->put(exec,Identifier("CSDN"),Instance::createRuntimeObject(Instance::QtLanguage,(void*)myObject));


这样就可以了。这是个测试程序,需要把这些测试代码添加到 WebKit 浏览器中。打开文件:
./src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
把刚才的 MyObject 类和 MyCSDNObject 类在其中声名一下,然后添加CSDN 根对象作为QWebFrame 类的私有成员,如下所示:

  1. classMyObject:publicQObject
  2. {
  3. Q_OBJECT
  4. //省略...
  5. };
  6. classMyCSDNObject:publicQObject
  7. {
  8. Q_OBJECT
  9. //省略...
  10. };
  11. classQWEBKIT_EXPORTQWebFrame:publicQObject
  12. {
  13. Q_OBJECT
  14. Q_PROPERTY(qrealtextSizeMultiplierREADtextSizeMultiplierWRITEsetTextSizeMultiplier)
  15. Q_PROPERTY(QStringtitleREADtitle)
  16. Q_PROPERTY(QUrlurlREADurlWRITEsetUrl)
  17. Q_PROPERTY(QIconiconREADicon)
  18. Q_PROPERTY(QSizecontentsSizeREADcontentsSize)
  19. private:
  20. QWebFrame(QWebPage*parent,QWebFrameData*frameData);
  21. QWebFrame(QWebFrame*parent,QWebFrameData*frameData);
  22. ~QWebFrame();
  23. //声名CSDN根对象
  24. MyCSDNObject*m_csdn;
  25. public:
  26. //以下省略...
  27. };


打开 qwebframe.cpp 文件,在 QWebFrame 的构造函数中创建 CSDN 根对象。

  1. QWebFrame::QWebFrame(QWebPage*parent,QWebFrameData*frameData)
  2. :QObject(parent)
  3. ,d(newQWebFramePrivate)
  4. {
  5. d->page=parent;
  6. d->init(this,parent->d->page,frameData);
  7. //在这里创建CSDN根对象
  8. {
  9. KJS::Bindings::RootObject*root=d->frame->bindingRootObject();
  10. KJS::ExecState*exec=root->interpreter()->globalExec();
  11. KJS::JSObject*global=root->interpreter()->globalObject();
  12. m_csdn=newMyCSDNObject();
  13. global->put(exec,KJS::Identifier("CSDN"),KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage,(void*)m_csdn,root));
  14. }
  15. if(!frameData->url.isEmpty()){
  16. ResourceRequestrequest(frameData->url,frameData->referrer);
  17. d->frame->loader()->load(request,frameData->name);
  18. }
  19. }

在 QWebFrame 的析构函数中删除 CSDN 根对象

  1. QWebFrame::~QWebFrame()
  2. {
  3. if(d->frame&&d->frame->loader()&&d->frame->loader()->client())
  4. static_cast(d->frame->loader()->client())->m_webFrame=0;
  5. if(m_csdn)
  6. {
  7. deletem_csdn;
  8. m_csdn=NULL;
  9. }
  10. deleted;
  11. }

再手工编写一个 HTML 测试页 csdn1.htm,内容如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<script language="JavaScript">
<!--
function test()
{
CSDN.myInterface.foo();
CSDN.myInterface.testString = "Hello QtWebKit JavaScript";
var str = CSDN.myInterface.testString;
document.getElementById("txtMessage").innerHTML = str;
}
//-->
</script>
</head>

<body>
<p><a href="javascript:test();">test qt-webkit javascript</a></p>
<p id="txtMessage"></p>
</body>
</html>

编译并运行WebKit 浏览器,让它打开刚才的测试页 csdn1.htm,点击上面的 test qt-webkit javascript 链接,可以得到下面的效果:

上面的 Hello QtWebKit JavaScript 就是 javascript 设置的 CSDN.myInterface.testString内容。

分享到:
评论

相关推荐

    QT选择性深度裁剪,图文解析

     -no-javascript-jit \  -no-separate-debug-info \  -no-dbus \  -no-exceptions \  -no-declarative \  -nomake docs \  -make lib \  -make include \  -no-largefile \  -no-xmlpatterns \  -no-...

    qt帮助文档 qt-help

    [-no-javascript-jit] [-javascript-jit] [-no-script] [-script] [-no-scripttools] [-scripttools] [-no-declarative] [-declarative] [-no-declarative-debug] [-declarative-debug] [additional platform ...

    利用Qt中的WebKit与网页中的javascript进行交互

    利用Qt中的WebKit与网页中的javascript进行交互; Demo中实现用javascript代码调用Qt中的函数,用Qt中的代码调用javascript中的函数; 测试网页:myjstest.html

    qtwebkit 程序与javascript交互

    qt webkit web native communicate

    awesome-qt:很棒的Qt

    很棒的Qt 精选Qt相关资料的精选清单。 基本模块 -其他模块使用的核心非图形类。 图形用户界面(GUI)组件的基类。... WebKit-用于基于WebKit2的实现和新的QML API的类。 另请参阅附加模块中的Qt

    利用QtWebKit完成JavaScript访问C++对象

    请先查看博客http://blog.csdn.net/longsir_area/article/details/42965565 再确定是否下载

    capybara-webkit:Capybara驱动程序,用于无头WebKit来测试JavaScript Web应用程序

    capybara-webkit 由于不推荐使用QtWebKit,而赞成使用QtWebEngine,因此该项目的开发已暂停。 相反,我们建议使用或驱动程序。Qt依赖关系和安装问题capybara-webkit依赖于跨平台开发工具包Qt的WebKit实现。 您需要...

    QDigraph:使用 Qt 的 QtWebKit 和 dagre-d3 javascript 库绘制有向图

    QDigraph 使用 javascript 库绘制有向图

    Qt写的谷歌地图示例

    一点不懂webkit和javascript开始摸起。如有疏漏多多斧正。 例子的功能就是在标准的qt主窗口加载一个谷歌地图。webkit在(0,0)放置一个图标。地图移动后通知Qt在标准输出打印经纬度。 因为以前上传资源的时候有人...

    Qt4.8.4和Echarts5.3.3绘制图表例子

    而Qt要显示web部分的东西,肯定是要用到QtWebkit(Qt4)或者 QtWebEngine(Qt5),这个视版本而定。 ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、...

    JavaScript字符拼贴库UnicodeTiles.js.zip

    UnicodeTiles.js 是提供一个基于文本字符...— 键盘处理Meta - general stuff基于 QtWebkit (要求 Qt)最好使用最新的 Chrome 和 Firefox 浏览器支持 IE9 和 Opera 11.61 不支持 IE8 及以下版本示例local link | online

    htmlPy:htmlPy是PySide的QtWebKit库的包装。 它有助于使用HTML5,CSS3和Javascript为独立的Python应用程序创建漂亮的GUI

    htmlPy是的QtWebKit库的包装。 它有助于使用HTML5,CSS3和Javascript为独立的Python应用程序创建漂亮的GUI。 它建立在之上,这使其高度可定制且跨平台。 htmlPy与Python2和Python3兼容。 它可以与任何python库或...

    phantomjs-2.1.1-windows

    它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON...

    browserext:一个基于QtWebKit的用于Web抓取和浏览器仿真PHP扩展。 支持JavaScript和AJAX

    BrowserExt PHP扩展是基于QtWebKit的程序化浏览器,用于Web抓取。 支持javascript和AJAX。 使用xpath选择元素 允许您填写表格,单击文档的元素 允许检索文档元素的属性,属性和其他参数,遍历树中的元素 允许通过...

    phantomjs-2.1.1-windows版.zip

    它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON...

    phantomjs-2.1.1-windows.rar

    它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行javaScript代码。任何你可以基于在webkit浏览器做的事情,它都能做到。它不仅是个隐性的浏览器,提供了诸如css选择器、支持wen标准、DOM操作、json...

    om-control-center:OpenMandriva Lx 控制中心

    om-控制中心版本:1.0.0 这是用于测试的 om-control-center 需要以下依赖项: python-qt4-webkit web.py bigbashview bigbashview 已与 om-control-center 脚本集成到 om-control-center 中安装依赖要安装 python-qt...

    入侵者:Python简单模块,用于从具有JavaScript支持的网站上获取数据

    侵略者 Invader是用于从网站获取数据的Python简单模块。 还具有JavaScript支持! 入侵者基于...$ sudo apt-get install qt5-default libqt5webkit5-dev build-essential python-lxml python-pip xvfb $ sudo

    phantomjs_2.1.1_window.rar

    它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON...

Global site tag (gtag.js) - Google Analytics