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”),其显示效果如下图: 
这里写图片描述

转载于:https://www.cnblogs.com/zhangxuan/p/7576829.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值