当前位置:   article > 正文

【QT进阶】Qt Web混合编程之html、 js的简单交互

【QT进阶】Qt Web混合编程之html、 js的简单交互

往期回顾

【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用(图文并茂超详细介绍)-CSDN博客
【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客
【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView(图文并茂超详细版本)-CSDN博客【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用(图文并茂超详细介绍)-CSDN博客

 【QT进阶】Qt Web混合编程之html、 js交互

在Qt中,可以使用Qt WebEngine模块来加载和显示HTML页面,并且可以通过Qt的JavaScript桥接功能来在C++代码中调用JavaScript函数,或者在JavaScript代码中调用C++代码中的槽函数。

通过这种方式,可以实现C++代码和HTML、JavaScript之间的双向通信,从而实现更加灵活和交互性强的应用程序。例如,可以在HTML页面中调用C++代码中的函数来获取数据或执行操作,也可以在C++代码中调用JavaScript函数来更新页面内容或响应用户交互操作。

一、简单交互实现

之前我们说了可以通过QWebEngineView调用load或者setUrl方法实现qt程序里显示网页。

而除了可以显示网页,其实我们还可以和网页交互,互相发消息,调用函数。

1、互相发消息,调用函数

1.1html页面调用C++函数,在c++.h里声明
Q_ INVOKABLE void receive TextFromHtml(const QString& r text);
1.2C++发送内容给html,htmI链接 
  1. content.sig_ sendTextToHtml.connect(function(message) {
  2. output("接收到来自Qt的文本: " + message);
  3. });

2、Qt.与html、js的桥梁QWebChannel 

2.1什么是QWebChannel 

QWebChannel是Qt中用于在C++代码和JavaScript之间进行通信的模块。它提供了一种简单而强大的方式来实现C++代码和JavaScript之间的双向通信,并且可以在Qt应用程序中加载和显示HTML页面,并与其中的JavaScript代码进行交互。

示例:

  1. QWebEnginePage* pPage = ui.webEngineView->page();
  2. QWebChannel* channel = new QWebChannel(this);

注册htm|对象 

  1. channel->registerObject(QStringLiteral("content"), m_pWebObj);
  2. pPage->setWebChannel(channel);
  3. connect(m_pWebObj, &Web0bject::sig_SendToUl, this, &QtWebDemo::update_text);

registerObject类似于反射机制,qwebchannel.js 可以从m_pWebObj里反 射出想要执行的Qt函数

3、qwebchannel.js 

3.1什么是qwechannel.js

qwebchannel.js是一个JavaScript库,用于在HTML页面中与C++代码进行通信。它提供了一种方便的方式来与QWebChannel通信,并且可以在JavaScript代码中调用C++代码中的槽函数,或者在C++代码中调用JavaScript代码中的函数。

 这个文件一定不能缺失,这个文件就相当于是qt和html交互的桥梁,是必须要有的,一般在qt的安装目录下就可以搜索到。

4、简单示例

4.1main.cpp
  1. // main.cpp
  2. #include <QApplication>
  3. #include <QWebEngineView>
  4. #include <QWebChannel>
  5. #include "myobject.h"
  6. int main(int argc, char *argv[])
  7. {
  8. QApplication app(argc, argv);
  9. QWebEngineView view;
  10. view.resize(800, 600);
  11. view.show();
  12. QWebChannel channel;
  13. MyObject myObject;
  14. channel.registerObject("myObject", &myObject);
  15. view.page()->setWebChannel(&channel);
  16. view.setUrl(QUrl("qrc:/index.html"));
  17. return app.exec();
  18. }
4.2myobject.h 
  1. // myobject.h
  2. #ifndef MYOBJECT_H
  3. #define MYOBJECT_H
  4. #include <QObject>
  5. class MyObject : public QObject
  6. {
  7. Q_OBJECT
  8. public slots:
  9. void showMessage(const QString &message);
  10. };
  11. #endif // MYOBJECT_H
4.3<!-- index.html --> 
  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>QWebChannel Example</title>
  6. <script src="qwebchannel.js"></script>
  7. </head>
  8. <body>
  9. <button onclick="sendMessage()">Send Message</button>
  10. <script>
  11. new QWebChannel(qt.webChannelTransport, function(channel) {
  12. var myObject = channel.objects.myObject;
  13. function sendMessage() {
  14. myObject.showMessage("Hello from JavaScript!");
  15. }
  16. });
  17. </script>
  18. </body>
  19. </html>
4.4示例分析

本实例中,我们首先创建了一个QWebChannel,并注册了一个名为MyObject的C++对象。然后,我们将这个QWebChannel设置到QWebEngineView中,并加载了一个包含JavaScript代码的HTML页面。在JavaScript代码中,我们通过qwebchannel.js库来与C++代码中的MyObject对象进行通信,当点击按钮时,会调用C++代码中的showMessage槽函数,从而实现了C++代码和JavaScript之间的双向通信。 


以上就是Qt里html、 js的简单交互基本用法的简单介绍。

通过示例不难看出来,QWebChannel和qwebchannel.js,可以很方便地实现C++代码和HTML、JavaScript之间的交互,从而实现更加灵活和交互性强的应用程序。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/543112
推荐阅读
相关标签
  

闽ICP备14008679号