Qt调用JS
转自:
一、 简介
Qt提供了本地C++对象与JavaScript的无缝集成,可以进行本地与web混合应用开发。利用Qt的Webkit集成与QtNetwork模块,可以自由的混合JavaScript、样式表、Web内容和Qt组件。对于C++和javaScript通信,最基本也最复杂的做法是使用COM,本文主要介绍使用Qt提供的QWebView和javaScript进行通信。
二、 流程
基本函数介绍
Qt与JavaScript互调是通过QWebFrame两个函数来实现的:addToJavaScriptWindowObject()将QObject对象传给JS,这样JS就能调用QObject的共有槽函数。Qt通过evaluateJavaScript()直接调用JS中德函数。其流程如下图:
函数说明
1. void QWebFrame::addToJavaScriptWindowObject(const QString& name,
QObject * object)
第一个参数:name为对象在javaScript里的名字,可以自由命名。
第二个参数:object对应的QObject实例指针。
要在JS调用该QObject之前调用这个函数,建议将这个函数放到一个signal的槽函数中调用,其使用代码代码如下:
connect(ui.webView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),this, SLOT(populateJavaScriptWindowObject()));
相应的槽函数为:
void 类名::populateJavaScriptWindowObject()
{
ui.webView->page()->mainFrame()->addToJavaScriptWindowObject(“formExtractor”, this);
}
2. QVariant QWebFrame::evaluateJavaScript(const QString &scriptSource)
建立一个工程,拖入一个QWebView,载入html网页,添加一个按钮调用javaScript,其代码为:
Ui.webView->page()->mainframe()->evaluateJavaScript(“Test()”) ;
其中Test()为javaScript中的Test()函数。
附注:如果Qt调用js函数,js函数带有参数,在Qt里该函数调用方法要写成如下形式:
QString method = QString(“JSFunction(\”%1\” , \”%2\”)”).arg(param1).arg(param2) ;
Ui.webView->page()->mainframe()->evaluateJavaScript(method) ;
三、 工程示例
新建Qt GUI工程项目QtJS,类名为mainWindow,继承基类选择为QMainWindow。往ui里拖入控件,其布局按如下设置:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
在mainwindow.cpp中添加头文件#include <QtCore/QUrl>、#include<QtWebK
itWidgets/QWebView>、#include <QtWebKitWidgets/QWebFrame>、#include<QtW
ebkit/QWebElement>。在mainwindow.h头文件中添加公有槽函数
void populateJavaScriptWindowObject() ;//为了保证每次打开新网页或刷新网页时都调用,将该槽函数和javaScriptWindowObjectCleared()信号相连
void pop1() ; //不传递参数到JavaScript
void pop2() ;//将Qt中的值传递到JavaScript
void JsCallQt() ;//JavaScript调用Qt,不传递参数
void JsCallQt(QStringList str) ;//JavaScript调用Qt,传递参数
在构造函数中建立信号和槽的连接
connect(ui.pushButton , SIGNAL(clicked()) , this , SLOT(pop1())) ;
connect(ui.pushButton_2 , SIGNAL(clicked()) , this , SLOT(pop2())) ;
connect(ui.webView->page()->mainFrame() , SIGNAL(javaScriptWindow
-ObjectCleared()) , this , SLOT(populateJavaScriptWindowObject())) ;
分别添加槽函数的定义:
void mainWindow::populateJavaScriptWindowObject()
{
ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("A" , this) ;
}
单击按钮(“不带参数传递到JS”),其效果如下图:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
弹出对话框为html中的一个警告,其代码如下:
在文本框中输入X、Y的值,单击按钮(“带参数传递到JS”),其效果
通过JavaScript调用Qt主要有两种方式,第一种:在Qt中定义一个公有的槽函数;第二种:在公有成员函数前添加Q_INVOKABLE宏。
添加JsCallQt()的定义如下:
void mainWindow::JsCallQt(QStringList str)
{
ui.lineEdit_3->setText(str[0]) ;
ui.lineEdit_4->setText(str[1]) ;
}
void mainWindow::JsCallQt()
{
QWebFrame *frame = ui.webView->page()->mainFrame();
QWebElement X = frame->findFirstElement("#X");
ui.lineEdit_3->setText(X.evaluateJavaScript("this.value").toString()) ;
QWebElement Y = frame->findFirstElement("#Y");
ui.lineEdit_4->setText(Y.evaluateJavaScript("this.value").toString()) ;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
JsCallQt()的两个版本分别对应html中的两个按钮,推荐使用第二种方式。第一种带参数传递时,好像需要在javascript中将变量设置为数组,传递多个参数时好像会失效(有兴趣可以验证)。
单击html中的按钮(“第二种方式传递到Qt”),其显示效果如下图:
一、 简介
Qt提供了本地C++对象与JavaScript的无缝集成,可以进行本地与web混合应用开发。利用Qt的Webkit集成与QtNetwork模块,可以自由的混合JavaScript、样式表、Web内容和Qt组件。对于C++和javaScript通信,最基本也最复杂的做法是使用COM,本文主要介绍使用Qt提供的QWebView和javaScript进行通信。
二、 流程
基本函数介绍
Qt与JavaScript互调是通过QWebFrame两个函数来实现的:addToJavaScriptWindowObject()将QObject对象传给JS,这样JS就能调用QObject的共有槽函数。Qt通过evaluateJavaScript()直接调用JS中德函数。其流程如下图:
函数说明
1. void QWebFrame::addToJavaScriptWindowObject(const QString& name,
QObject * object)
第一个参数:name为对象在javaScript里的名字,可以自由命名。
第二个参数:object对应的QObject实例指针。
要在JS调用该QObject之前调用这个函数,建议将这个函数放到一个signal的槽函数中调用,其使用代码代码如下:
connect(ui.webView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),this, SLOT(populateJavaScriptWindowObject()));
相应的槽函数为:
void 类名::populateJavaScriptWindowObject()
{
ui.webView->page()->mainFrame()->addToJavaScriptWindowObject(“formExtractor”, this);
}
2. QVariant QWebFrame::evaluateJavaScript(const QString &scriptSource)
建立一个工程,拖入一个QWebView,载入html网页,添加一个按钮调用javaScript,其代码为:
Ui.webView->page()->mainframe()->evaluateJavaScript(“Test()”) ;
其中Test()为javaScript中的Test()函数。
附注:如果Qt调用js函数,js函数带有参数,在Qt里该函数调用方法要写成如下形式:
QString method = QString(“JSFunction(\”%1\” , \”%2\”)”).arg(param1).arg(param2) ;
Ui.webView->page()->mainframe()->evaluateJavaScript(method) ;
三、 工程示例
新建Qt GUI工程项目QtJS,类名为mainWindow,继承基类选择为QMainWindow。往ui里拖入控件,其布局按如下设置:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
在mainwindow.cpp中添加头文件#include <QtCore/QUrl>、#include<QtWebK
itWidgets/QWebView>、#include <QtWebKitWidgets/QWebFrame>、#include<QtW
ebkit/QWebElement>。在mainwindow.h头文件中添加公有槽函数
void populateJavaScriptWindowObject() ;//为了保证每次打开新网页或刷新网页时都调用,将该槽函数和javaScriptWindowObjectCleared()信号相连
void pop1() ; //不传递参数到JavaScript
void pop2() ;//将Qt中的值传递到JavaScript
void JsCallQt() ;//JavaScript调用Qt,不传递参数
void JsCallQt(QStringList str) ;//JavaScript调用Qt,传递参数
在构造函数中建立信号和槽的连接
connect(ui.pushButton , SIGNAL(clicked()) , this , SLOT(pop1())) ;
connect(ui.pushButton_2 , SIGNAL(clicked()) , this , SLOT(pop2())) ;
connect(ui.webView->page()->mainFrame() , SIGNAL(javaScriptWindow
-ObjectCleared()) , this , SLOT(populateJavaScriptWindowObject())) ;
分别添加槽函数的定义:
void mainWindow::populateJavaScriptWindowObject()
{
ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("A" , this) ;
}
单击按钮(“不带参数传递到JS”),其效果如下图:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
弹出对话框为html中的一个警告,其代码如下:
在文本框中输入X、Y的值,单击按钮(“带参数传递到JS”),其效果
通过JavaScript调用Qt主要有两种方式,第一种:在Qt中定义一个公有的槽函数;第二种:在公有成员函数前添加Q_INVOKABLE宏。
添加JsCallQt()的定义如下:
void mainWindow::JsCallQt(QStringList str)
{
ui.lineEdit_3->setText(str[0]) ;
ui.lineEdit_4->setText(str[1]) ;
}
void mainWindow::JsCallQt()
{
QWebFrame *frame = ui.webView->page()->mainFrame();
QWebElement X = frame->findFirstElement("#X");
ui.lineEdit_3->setText(X.evaluateJavaScript("this.value").toString()) ;
QWebElement Y = frame->findFirstElement("#Y");
ui.lineEdit_4->setText(Y.evaluateJavaScript("this.value").toString()) ;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
JsCallQt()的两个版本分别对应html中的两个按钮,推荐使用第二种方式。第一种带参数传递时,好像需要在javascript中将变量设置为数组,传递多个参数时好像会失效(有兴趣可以验证)。
单击html中的按钮(“第二种方式传递到Qt”),其显示效果如下图:
Qt调用JS的更多相关文章
- Qt调用JS(二)
转自:http://www.cnblogs.com/verstin/p/4908673.html <html> <script language="JavaScript&q ...
- qt调用js,js调用qt
<html> <script language="JavaScript"> function qtcalljs() { alert("sdfsd& ...
- Qt与JS(三)
Qt不错的学习网址: http://www.cnblogs.com/findumars/p/5529526.html ----------------------------------------- ...
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
[问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...
- iOS开发--OC调用JS篇
OC调用JS篇 其中相对应的html部分如下: <html> <header> <meta http-equiv="Content-Type" con ...
- js调用php和php调用js的方法举例
js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...
- ActiveX(三)ActiveX 调用 Js
在上一篇随笔: ActiveX(二)Js 监听 ActiveX中的事件 中,已经可以实现 Js 监听 ActiveX中的事件,至此.Js 和 ActiveX 已经可以实现双向通讯了.但是.这样的实现 ...
- 配合 APP 调用 JS 的一次尝试
项目初衷 最初的场景是用户在对购物车的操作中,由于用户对购物车的每次操作(包括选择,调整数量)都需要计算商品的促销和分组的情况,而这段逻辑的计算都需要调用后端的接口,那么瓶颈来了: 请求时间长--一次 ...
- QT 调用VS2015编写的Dll
最近在用QT调用VC生成的库,QT使用的是MinGW调试器,出现与动态库不兼容的问题,最后发现QT只能识别VC生成的C格式下的动态库 也就是在导入导出设置时加入extern "C" ...
随机推荐
- React native 开发如何使用阿里的icon
首先是通过Text来引用的 但是区分是 familay <Text style={{fontFamily:'iconfont', fontSize:fontsize, color:this.st ...
- Node.js代码模块化
js语言发展到现在逐渐的像后端语言来,学习了一些后端语言的特性,这里主要讲述的是js语言的模块化管理 首先新建一个js文件 'use strict'; var s = 'Hello'; functio ...
- 初步接触ES6
Babel---ES6转码器 ES6 声明变量的六种方法 ES5 只有两种声明变量的方法:var命令和function命令. ES6除了添加let和const命令,另外两种声明变量的方法:import ...
- P1330 封锁阳光大学
传送门 思路: 依题意可知,在图中的每一条边有且只有一个点被选中(阻止老曹刷街),那么就可以对其采取二分图染色,一条边中:一个点为黑色,另一个点为白色:如果一条边中的两个端点的颜色相同,则说明无解,输 ...
- JavaScript的案例(数据校验,js轮播图,页面定时弹窗)
1.数据校验 步骤 1.确定事件(onsubmit)并绑定一个函数 2.书写这个函数,获取数据,并绑定id 3. ...
- 力扣 报错 runtime error: load of null pointer of type 'const int'
runtime error: load of null pointer of type 'const int' 要求返回的是int* 解决方案 1.指针使用malloc分配空间 用 int * p = ...
- Android接入微信SDK之一:发起微信授权登录
1.重要的事情首先说! 包名.应用签名.app id 三者都必须和在腾讯上申请的一致!!!否则将不能成功. 包名:就是在腾讯上申请的包名 应用签名:使用微信官网提供的<签名生成工具>(这个 ...
- 解决微信video全屏的问题,不在本页面播放
在微信浏览器中使用video标签,点击播放会跳出本页面,自动进行全屏播放,原因是自动跳转到手机微信内置的浏览器中去播放去了!!! 在video中加上连个属性就好了,反正最近的一个项目,我是这样做的就好 ...
- c# 7.0 学习笔记
refer : https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7 out 可以写在里面了 // int result ...
- spring cloud: 关闭ribbon负载均衡
spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...