0


QT通过QWebChannel模块实现与HTML通信(web端),获取高德地图中某个点位的经纬度坐标。

基于我个人的上一篇内容,通过调用高德API创建了地图,链接如下。“QT6 调用高德地图API创建地图(初学者级)”

  1. 本篇根据上一篇所实现的内容基础上,使用QT中的webchannel方法实现与HTML交互,在HTML中使用了Javascript代码实现。实现鼠标左键点击某个位置即可获得该地点的经纬度坐标,效果如下:

1.项目结构如下:

  1. .pro文件和main.cpp文件除了在.pro文件中加入几个模块以外,没有其他改动,因此直接放入代码

240505.pro

  1. QT += core gui webenginewidgets webenginecore webchannel
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. CONFIG += c++17
  4. # You can make your code fail to compile if it uses deprecated APIs.
  5. # In order to do so, uncomment the following line.
  6. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
  7. SOURCES += \
  8. main.cpp \
  9. maplistener.cpp \
  10. widget.cpp
  11. HEADERS += \
  12. maplistener.h \
  13. widget.h
  14. FORMS += \
  15. widget.ui
  16. # Default rules for deployment.
  17. qnx: target.path = /tmp/$${TARGET}/bin
  18. else: unix:!android: target.path = /opt/$${TARGET}/bin
  19. !isEmpty(target.path): INSTALLS += target

main.cpp

  1. #include "widget.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. Widget w;
  7. w.show();
  8. return a.exec();
  9. }
2.创建一个c++的类,用于实现QT和HTML中的通信。代码如下

maplistener.h

  1. #ifndef MAPLISTENER_H
  2. #define MAPLISTENER_H
  3. #include<QDebug>
  4. #include <QObject>
  5. class MapListener : public QObject
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit MapListener(QObject *parent = nullptr);
  10. signals:
  11. void positionUpdated(const QString &position); // 声明一个信号
  12. public slots:
  13. void updatePosition(const QString &position) {
  14. // 在这里处理接收到的经纬度数据
  15. qDebug() << "Received position:" << position;
  16. emit positionUpdated(position); // 发出信号
  17. }
  18. };
  19. #endif // MAPLISTENER_H

maplistener.cpp

  1. #include "maplistener.h"
  2. MapListener::MapListener(QObject *parent)
  3. : QObject{parent}
  4. {}
3.编写widget函数
  1. 在头文件中,只需要进行一个槽的声明即可(槽需要有函数实现,而信号不用)。这里面声明的槽跟maplistener.h中声明的信号后面组成一对。

widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QtWidgets>
  4. #include <QWebEngineView>
  5. #include <QWidget>
  6. QT_BEGIN_NAMESPACE
  7. namespace Ui {
  8. class Widget;
  9. }
  10. QT_END_NAMESPACE
  11. class Widget : public QWidget
  12. {
  13. Q_OBJECT
  14. public:
  15. Widget(QWidget *parent = nullptr);
  16. ~Widget();
  17. private:
  18. Ui::Widget *ui;
  19. private slots:
  20. void onPositionUpdated(const QString &position); // 声明一个槽来更新 QTextEdit
  21. };
  22. #endif // WIDGET_H
  1. 在对应的cpp文件中,首先头文件声明的槽函数实现一下,可以根据自己的需要更改。我这里是把经纬度分别分开,然后显示在不同的textedit控件中。
  2. connect中,按照正常逻辑是在maplistener中直接放置控件,例如QWebEngineView的某个对象即可,例如名为web_widgetQWebEngineView控件。但是由于是web端,所以没有办法直接通信,因此我们需要通过QT给我们的webchannel方法来实现。
  3. 在使用方法中,new一个QWebChannel对象,并且指向自己创建的窗口。
  4. 其中下方这两行代码是非常重要的,并且QStringLiteral("maplistener")这个“maplistener”名称就是对应的要连接的html中到时候要使用的javascript的名称,通过这个名称可以调用maplistener中的成员。
  1. QWebChannel *channel = new QWebChannel(ui->web_widget->page());
  2. channel->registerObject(QStringLiteral("maplistener"), maplistener);
  1. 下面是在htmljavascript调用的方法。
  1. channel.objects.maplistener.updatePosition(lnglat);

widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QWebEngineView>
  4. #include <QWebChannel>
  5. #include <QObject>
  6. #include"maplistener.h"
  7. Widget::Widget(QWidget *parent)
  8. : QWidget(parent)
  9. , ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. ui->web_widget->setUrl(QUrl("http://localhost:8000/获取经纬度坐标(实验).html"));
  13. MapListener *maplistener = new MapListener(this);
  14. QWebChannel *channel = new QWebChannel(ui->web_widget->page());
  15. channel->registerObject(QStringLiteral("maplistener"), maplistener);
  16. ui->web_widget->page()->setWebChannel(channel);
  17. connect(maplistener,&MapListener::positionUpdated,this,&Widget::onPositionUpdated);
  18. }
  19. Widget::~Widget()
  20. {
  21. delete ui;
  22. }
  23. void Widget::onPositionUpdated(const QString &position)
  24. {
  25. // 使用逗号作为分隔符来分割字符串
  26. QStringList parts = position.split(",");
  27. // 检查是否至少有两个部分
  28. if (parts.size() >= 2) {
  29. // 移除可能的空格或换行符,并转换为浮点数(如果需要的话)
  30. QString part1 = parts[0].trimmed();
  31. QString part2 = parts[1].trimmed();
  32. // 将分割后的部分设置到对应的QTextEdit中
  33. ui->textEdit1->setText(part1);
  34. ui->textEdit2->setText(part2);
  35. } else {
  36. // 如果字符串没有按预期分割,可以设置一些默认值或显示错误信息
  37. ui->textEdit1->setText("Invalid position (part 1)");
  38. ui->textEdit2->setText("Invalid position (part 2)");
  39. }
  40. }

widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QtWidgets>
  4. #include <QWebEngineView>
  5. #include <QWidget>
  6. QT_BEGIN_NAMESPACE
  7. namespace Ui {
  8. class Widget;
  9. }
  10. QT_END_NAMESPACE
  11. class Widget : public QWidget
  12. {
  13. Q_OBJECT
  14. public:
  15. Widget(QWidget *parent = nullptr);
  16. ~Widget();
  17. private:
  18. Ui::Widget *ui;
  19. private slots:
  20. void onPositionUpdated(const QString &position); // 声明一个槽来更新 QTextEdit
  21. };
  22. #endif // WIDGET_H
4.编写HTML文件以及其中的Javascript代码
  1. 在这个部分需要用到qwbchannel.js文件,这个文件直接从自己安装目录下面的“QT.6\Examples\Qt-6.5.3\webchannel\shared”这个文件夹下获得即可,记得这个js文件要跟html放在同一个位置,不然找不到好像。不是很懂,希望有大哥解答一下!

获取经纬度坐标(实验).html

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  7. <title>鼠标拾取地图坐标</title>
  8. <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
  9. <script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
  10. <script type="text/javascript" src="./src/qwebchannel.js"></script>
  11. </head>
  12. <style type="text/css">
  13. html,body{
  14. width: 100%;
  15. height: 100%;
  16. margin: 0px;
  17. }
  18. .map{
  19. height: 100%;
  20. width: 100%;
  21. float: left;
  22. }
  23. </style>
  24. <body>
  25. <div id="container" class="map"></div>
  26. </div>
  27. <script src="https://webapi.amap.com/maps?v=1.4.15&key=“输入自己注册的key”&plugin=AMap.Autocomplete"></script>
  28. <script src="qwebchannel.js"></script>
  29. <script type="text/javascript">
  30. new QWebChannel(qt.webChannelTransport, function (channel) {
  31. // 为地图注册click事件获取鼠标点击出的经纬度坐标
  32. var map = new AMap.Map("container", {
  33. mapStyle: "amap://styles/blue",resizeEnable: true
  34. });
  35. map.on('click', function(e) {
  36. var lnglat = e.lnglat.getLng() + ',' + e.lnglat.getLat();
  37. // 假设你在 Qt 端注册了一个名为 'mapListener' 的对象,并且它有一个 'updatePosition' 方法
  38. channel.objects.maplistener.updatePosition(lnglat);
  39. });
  40. });
  41. </script>
  42. </body>
  43. </html>
标签: qt html c++

本文转载自: https://blog.csdn.net/xiaoluo2333/article/details/138618778
版权归原作者 xiaoluo2333 所有, 如有侵权,请联系我们删除。

“QT通过QWebChannel模块实现与HTML通信(web端),获取高德地图中某个点位的经纬度坐标。”的评论:

还没有评论