2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Qt5.6 c++与网页html/js的交互实现

Qt5.6 c++与网页html/js的交互实现

时间:2021-04-03 11:07:00

相关推荐

Qt5.6 c++与网页html/js的交互实现

Qt5.6 c++与网页html/js的交互实现

本篇文章主要讲解Qt5.6之后的QWebEngine与html或js的交互。在Qt5.6之前Qt窗体嵌入网页使用的是QWebKit但是Qt5.6将webkit去掉了,这时候很多人由于以前的项目中使用了QWebkit,而不想对Qt进行升级。

Qt5.6之前Qt与html/js的交互方式

Qt5.6之后的交互方式

为什么要改变

改变之后的优点

Qt5.6之前Qt与html/js的交互方式

Qt5.6之前Qt加载html以及与网页的交互统统用的都是QWebkit,显示网页用的都是QWebView。具体的使用方式为:

-在Qt中加载页面

QWebView jsWebView;jsWebView.load(QUrl(""));//jsWebView.show(); 加入这行代码就可以看到窗体了

-在Qt中运行js对象

QVariant ret = jsWebView->page()->mainFrame()->evaluateJavaScript(strParam); //strparam是运行js函数可以带的参数QString content = ret.toString();//查看运行结果

-js对象调用Qt的函数

//MainWindow 为注册的对象,为了能让js使用此对象jsWebView->page()->mainFrame()->addToJavaScriptWindowObject("MainWindow",this);然后可以在js代码中使用MainWindow对象调用Qt的槽函数

相信这种方法很多Qter已经掌握了。下面就来说一说Qt进入到5.6之后的调用方法

Qt5.6调用js的方法

Qt5.6之后不能使用QWebView了。代替它的是QWebEngineView。QWebEngineView的使用方式同QWebView基本一致。下面来看下代码

QWebEngineView *engine = new QWebEngineView(this);connect(engine, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));engine->load(QUrl(QDir::currentPath() + "socketio.html"));engine->show();

Qt5.6之后与js通信的重要类是:QWebChannel

-交互的具体实现代码

1. Qt调用js的函数:

engine->page()->runJavaScript(strPusherURL,0,[](const QVariant &var){qDebug() << var.toString();});

js中调用Qt的函数

QWebChannel *channel = new QWebChannel(engine->page());channel->registerObject(QStringLiteral("MainWindow"), this);engine->page()->setWebChannel(channel);

以上第二步方式能够让js使用Qt的对象,但是从js能够调用到具体的函数就得再下点功夫,并且是跟之前的版本完全不同的方法。

* 使用属性系统设置回调方法。

具体的例子:

Q_PROPERTY(QString param1 READ objectName WRITE setContent)Q_PROPERTY(QString param2 READ objectName WRITE setContent)

以上方式就是设置了两个属性,这两个属性为js调用Qt函数setContent时的参数。

如果你的代码这样编写了,运行了,排除掉语法错误之后,编译器还是会报道一个错误的。

:-1: error: No rule to make target../chatclient-html/qwebchannel.js', needed byqwebchannel.js’. Stop.

但是不要着急,这个文件时Qt通信需要带的文件,你可以打开creator的例子 搜索下QWebChannel,打开工程,打开工程文件你就可以找到这个js文件了。

如果你以前的代码用QWebKit方式编写的,要升级到5.6,其实很简单。

1. 加入QWebChannel

2. 修改注册对象方式为:registerObject

3. 使用属性系统设置回调方法以及回调的参数

4. 工程中加入qwebchannel.js文件

Qt官方为什么要改变以及改变之后的优点

是官方的推荐方式,他可以很方便的实现C++和HTML/JS的双向通信,同时实现C++和HTML/JS的解耦,方便开发人员的分工及系统集成,参见后面的例子。

在QT5.5和QT5.6中,利用Qt的QtWebEngine和WebChannel模块,你完全可以进行本地桌面与web混合应用开发,你可以自由地混合JavaScript,样式表,Web内容和Qt组件。基于Chromium的

QtWebEngine是一个非常成熟的web浏览引擎。你可以在C++中执行JavaScript,或者在网页中集成C++对象,并且通过JavaScript和这些对象进行交互。

一个现代的HTML渲染引擎只是混合开发的一半,另一半就是本地应用和渲染对象的交互。QT的Chromium的QtWebEngine集成提供了这种解决方案,当然目前还不是很完善。

从QT5.4开始就新增了QtWebChannel模块,该模块提供了在QML/C++和HTML/Javascript之间的一个简单、易用的桥接,从而使得开发能够使用Qt和Web技术进行混合开发,目前QT官方也推荐是用QtWebChannel来桥接C++和HTML,参见Qt

WebChannel–bridgingthegapbetweenC++/QMLandtheweb——/watch?v=KnvnTi6XafA,这是Qt开发者大会上的一段视屏演讲。

通过QtWebChannel能够实现C++/QML和HTML/javascript客户端之间进行无缝桥接,目前主要支持两种方式的桥接。

客户机可以是任何支持WebSockets的JavaScriptruntime机器和应用,客户机可以是独立的应用或浏览器。也就是说QtWebChannel是基于WebSockets协议之上。

通过IPC的方式实现C++/QML和HTML/javascript客户端之间进行通信。在QT应用内嵌入HTML或JS页面的情况下使用基于IPC的WebChannel通信效率更高效。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。