热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QT——与Javascript交互

转自:http:blog.csdn.netplaystudyarticledetails8255826目录1Qt和Javascript交互的两种方式为了充分发挥J

转自:http://blog.csdn.net/playstudy/article/details/8255826

目录

1 Qt和Javascript交互的两种方式


  为了充分发挥Javascript的跨平台特性,Qt和Javascript交互将不采用“Qt对Javascript公开对象引用”的方式(即通过QWebFrame的addToJavascriptWindowObject方法向Javascript提供对象引用)。这种方式虽然使得Qt和Javascript能直接的交互,但是Javascript端对于Qt端的依赖将影响Javascript发挥跨平台性。该方式调用原理如图1-1中左图所示:

  

 从图中不难看出,左边的方式中Javascript对Qt对象的依赖不利于Javascript往其它平台移植。而右边的“自定义URL”方式则不一样,Javascript不再选择利用Qt对象去调用Qt方法,而是直接向Webkit浏览器发送自定义URL,Webkit捕获到URL后通过QWebKit自身提供的Signal来关联Qt中的Slots函数,并向Slots函数传递URL,Slots函数就可以根据URL中的信息作出相应处理。在“自定义URL”方式中,底层平台不论是Qt,还是Android,上层的Javascript只需发送“自定义URL”即可。这样Javascript的平台无关性就能得以充分发挥。如图1-2所示:

图1-2

2实例分析

  对“自定义URL”方式有了初步认识后,下面通过一个实例来叙述这种“自定义URL”的方式中可能涉及到的技术点。

2.1 前端——HTML和Javascript

  例子中涉及2个html文件a.html、b.html和一个Javascript文件js.js。文件b.html很简单,就是一句欢迎语,文件a.html运行如图2-1所示:

图2-1

其对应的代码如下:



text a:b.html



该html文件中引用到的js.js代码如下:
function sendURL()
{var value = document.getElementById("aText").value.replace(/\s/g,"");if(value != ""){if(confirm("Go to " + value +"?")) {location.href = value;}} else {document.getElementById("warning").innerHTML = "Please Input Target";}
}

2.2 后台——Qt

  从a.html和js.js端的代码不难看出,当用户在a.html页面上文本框内输入内容后,点击“Go”按钮就会触发js.js中的sendURL方法,该方法会把用户在文本框内输入的内容当作URL发送,那么后台的Qt端如何得到这个URL呢?

2.2.1 loadStarted信号

  通过查阅Qt帮助文档找到这样一个信号——loadStarted(),该信号在QWebView、QWebPage和QWebFrame均存在。当开始加载一个新的网页时产生该信号,所以接收Javascript产生的URL可以尝试从该信号入手。

2.2.2 requestedUrl函数

  QWebFrame有个方法叫做requestedUrl()。当产生URL请求而加载Web页面时,调用该方法能过获取到请求的URL。看来接收Javascript产生的URL,这个方法不可或缺。

2.2.3 获取URL

  下面结合前面选择的信号和方法来获取Javascript产生的URL。

1、为loadStarted信号设置Slots函数
QWebPage * page = view->page();

connect(page, SIGNAL(loadStarted()), this, SLOT(doLoad()));2、接收URL
void MyMainWindows::doLoad()
{QUrl url &#61; view->page()->mainFrame()->requestedUrl();qDebug()<<"doLoad...."<}

parseURL的具体实现参见附录。

2.2.4 演示实例

  接收成功后&#xff0c;就可以由Qt解析URL&#xff0c;由URL中的信息来选择应该执行什么操作。

  在本例子中&#xff0c;如果URL是字符串“print”&#xff0c;那么就调用“print”相关模块&#xff08;简单的输出信息&#xff0c;然后跳转到b.html页面&#xff09;。图2-2为实例运行后的主界面&#xff1a;

图2-2

  输入print&#xff0c;点击“Go”按钮&#xff0c;界面切换&#xff0c;如图2-3所示&#xff1a;

图2-3

  同时观察控制台输出&#xff0c;如图2-4所示&#xff1a;

图2-4

  从输出信息中可以看出&#xff0c;接收到的URL为文件绝对路径&#xff0c;解析后比较URL&#xff0c;如果等于“print”&#xff0c;那么就执行“Call Moudle Of Print”&#xff0c;并加载b.html。

  注意&#xff0c;加载b.html页面时同样会因为产生loadStarted信号而执行预先设置好的Slots函数。至此演示完毕&#xff01;

3小结

  在小结之前先来看a.html中埋下的一个小伏笔。

  在a.html中有个超链接“b.html”&#xff0c;该链接的URL指向b.html页面&#xff0c;正常情况下点击该链接就会跳转到b.html页面&#xff0c;但为何在本实例程序中点击b.html不会有任何跳转呢&#xff1f;这其中的原因在于QWebKit中的linkClicked信号&#xff0c;当点击Web页面中的超链接时就会产生该信号。本例中为该信号设置Slots函数&#xff0c;函数中没有对超链接的URL进行加载&#xff0c;所以点击超链接后不会产生任何跳转。类似于linkClicked这样的信号还有很多&#xff0c;可以根据不同的需求选择使用。

  对比两种交互方式&#xff0c;“Qt对Javascript公开对象引用”的方式在Javascript调用Qt的过程中表现得较为直接&#xff0c;而“自定义URL”的交互方式很好地解决了跨平台问题。总之&#xff0c;方案没有好坏之分&#xff0c;各有所长&#xff0c;根据实际需求选取即可。

4附录


1、parseURL方法具体实现如下&#xff1a;

void MyMainWindows::parseURL(QUrl url)
{ QString urlStr &#61; url.toString();qDebug()<<"parseURL...."<Url:"<;if(ret.operator&#61;&#61;(QString("print")));{qDebug()<<"Call Moudle Of Print";/*如果找不到该url&#xff0c;app exited with code -1073741819*/view->load(QUrl("../b.html"));}}
}

2、使用linkClicked信号前必须调用setLinkDelegationPolicy&#xff1a;

setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
connect(page, SIGNAL(linkClicked(QUrl)), this, SLOT(parseURL(QUrl)));

 


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
author-avatar
手机用户2502886253
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有