Qt5.7+QWebEngineView实战:如何避免百度地图API加载时的5个常见坑(附完整项目)

QT5.15.2救急指南:解决QWebEngineView加载百度/高德地图空白问题(附6.X避坑方案) 本文针对QT开发中QWebEngineView加载百度/高德地图出现空白页面的常见问题,提供了详细的诊断与解决方案。核心在于QT 5.15.2与6.X版本Web引擎(Chromium内核)的兼容性差异。文章首先指导如何通过控制台错误信息定位问题,并重点推荐了回退至稳定版本QT 5.15.2的紧急救援方案,同时为必须使用QT 6.X的用户提供了配置调整、异步加载等深度排查思路。 阅读详情

Qt5.7与百度地图API深度集成:从零构建到实战避坑全指南

如果你正在用Qt开发桌面应用,并且需要集成地图功能,那么Qt的QWebEngineView配合百度地图API,无疑是一个强大且灵活的选择。但这条路走起来并不平坦,尤其是在Qt 5.7这个特定版本下,从环境配置、通信建立到异常处理,每一步都可能遇到意想不到的“坑”。我自己在几个工业监控和数据分析项目中反复折腾,才把这条路走通。今天,我就把自己踩过的坑、总结的经验,以及那些官方文档里不会写的细节,系统地分享给你。这篇文章不仅会带你搭建一个完整的、可交互的地图模块,更重要的是,我会重点剖析那些调试时控制台不报错,但功能就是“罢工”的疑难杂症,让你在开发时少走弯路。

1. 项目环境搭建与核心组件解析

在动手写代码之前,理清技术栈和准备工作至关重要。Qt 5.7是一个分水岭,它正式用QWebEngine模块取代了旧的QWebKit。这意味着,如果你还在用MinGW编译器,很可能会发现根本找不到QWebEngineWidgets这个模块。所以,第一个关键决策就是使用MSVC编译器。我推荐使用Qt 5.7 + MSVC2015的组合,这是经过验证比较稳定的环境。

我们的目标是构建一个C++(Qt)与JavaScript(百度地图)双向通信的桥梁。整个架构依赖于三个核心文件:

  1. 你的Qt项目:包含主程序、UI界面和一个自定义的Bridge类。
  2. BDMap.html:承载百度地图的HTML页面。
  3. qwebchannel.js:Qt官方提供的JavaScript库,用于建立通信通道。

这里有一个常见的误解:qwebchannel.js需要从网上下载或单独配置。其实不然,它就在你的Qt安装目录里。例如,在Qt/5.7/msvc2015/qml/QtWebChannel目录下就能找到。你只需要把它拷贝到你的BDMap.html同级目录即可。

注意:BDMap.html和qwebchannel.js的文件路径是后续几乎所有问题的根源。你可以选择将它们作为资源文件嵌入到Qt程序中(使用qrc:路径),也可以放在应用程序的同级目录下(使用相对路径)。前者便于发布,后者便于调试时热更新HTML/JS代码。我建议开发初期使用相对路径,发布时再改为资源文件。

让我们从创建Qt项目开始。使用Qt Creator新建一个Qt Widgets Application,项目名比如叫BaiduMapDemo。第一件要做的事,就是修改项目文件(.pro):

QT       += core gui webenginewidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = BaiduMapDemo
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp \
        bridge.cpp
HEADERS += mainwindow.h \
           bridge.h
FORMS += mainwindow.ui
RESOURCES += \
    map.qrc

关键的一行是 QT += webenginewidgets,这引入了Web引擎模块。

接下来,我们创建通信的桥梁——Bridge类。这个类继承自QObject,它的作用是将C++对象暴露给JavaScript世界。

// bridge.h
#ifndef BRIDGE_H
#define BRIDGE_H

#include <QObject>
#include <QDebug>

class Bridge : public QObject
{
    Q_OBJECT
public:
    explicit Bridge(QObject *parent = nullptr);

public slots: // 供JavaScript调用的槽函数
    void onMapClicked(double lng, double lat);
    void jsLog(const QString &message);

signals: // 用于通知Qt界面的信号
    void coordinateReceived(double longitude, double latitude);
};

#endif // BRIDGE_H
// bridge.cpp
#include "bridge.h"

Bridge::Bridge(QObject *parent) : QObject(parent) {}

void Bridge::onMapClicked(double lng, double lat) {
    qDebug() << "地图点击坐标: " << lng << ", " << lat;
    emit coordinateReceived(lng, lat); // 转发信号
}

void Bridge::jsLog(const QString &message) {
    qDebug() << "[JS Log]:" << message;
}

这个Bridge类定义了两个槽函数:onMapClicked用于接收地图点击事件,jsLog是一个通用的调试函数,非常有用,我们后面会讲到。

2. 构建通信桥梁:QWebChannel的深度配置

有了Bridge类,下一步就是在Qt主窗口和Web页面之间建立连接。这是整个集成的核心,也是最容易出错的地方。很多教程只告诉你步骤,却没解释清楚每个参数的意义和背后的原理,导致一旦出现问题就无从下手。

首先,在UI设计器中,拖入一个QWidget到主窗口上,比如命名为mapContainer。然后,关键步骤来了:右键点击这个QWidget,选择“提升为...”,在“提升的类名称”中填入QWebEngineView,头文件填入<QWebEngineView>,点击“添加”并“提升”。这样,这个普通的Widget就拥有了加载网页的能力。

在主窗口的构造函数中,我们需要完成通道的建立:

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWebChannel>
#include <QWebEngineView>
#include "bridge.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 1. 创建桥接对象和通道
    m_bridge = new Bridge(this);
    QWebChannel *channel = new QWebChannel(this);

    // 2. 将桥接对象注册到通道,并指定一个在JS中访问的标识符
    channel->registerObject("qtBridge", m_bridge);

    // 3. 获取Web视图的页面对象,并设置Web通道
    QWebEngineView *webView = qobject_cast<QWebEngineView*>(ui->mapContainer);
    if (webView) {
        webView->page()->setWebChannel(channel);

        // 4. 加载本地HTML文件
        // 方式一:使用资源文件(发布时推荐)
        // webView->setUrl(QUrl("qrc:/html/BDMap.html"));
        // 方式二:使用相对路径(调试时方便)
        webView->setUrl(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + "/Baidu_JS/BDMap.html"));
    }

    // 连接Bridge发出的信号到UI更新槽
    connect(m_bridge, &Bridge::coordinateReceived, this, [this](double lng, double lat){
        ui->labelCoordinate->setText(QString("经度: %1, 纬度: %2").arg(lng).arg(lat));
    });
}

这段代码有几个极易被忽略的细节:

  • registerObject的标识符:这里的"qtBridge"是自定义的,但它必须与HTML中JavaScript代码里访问的对象名严格一致。不一致会导致JS无法调用C++对象。
  • setWebChannel的调用时机:必须在load()或setUrl()之前调用。如果先加载页面再设置通道,通信将无法建立。
  • 路径问题:使用qrc资源系统时,确保.qrc文件正确包含了HTML和JS文件。使用本地路径时,要确认程序运行时,该路径下确实存在这些文件。一个调试技巧是:在调用setUrl前,用qDebug()打印出完整的路径,检查是否正确。

现在,让我们看看HTML和JavaScript这一侧该如何配合。BDMap.html文件的基本结构如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Qt集成百度地图</title>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=你的百度地图AK"></script>
    <style> body, html, #mapContainer { width: 100%; height: 100%; margin: 0; padding: 0; } </style>
</head>
<body>
    <div id="mapContainer"></div>

    <!-- 引入Qt的通信库 -->
    <script src="qwebchannel.js"></script>

    <script type="text/javascript">
        var map;
        var qtBridge; // 这将对应C++中注册的qtBridge对象

        // 初始化地图
        function initMap() {
            map = new BMap.Map("mapContainer");
            var point = new BMap.Point(116.404, 39.915); // 北京天安门
            map.centerAndZoom(point, 12);
            map.enableScrollWheelZoom(true);

            // **关键步骤:初始化QWebChannel**
            new QWebChannel(qt.webChannelTransport, function(channel) {
                // 这里的'qtBridge'必须与C++中registerObject的第一个参数一致
                qtBridge = channel.objects.qtBridge;
                console.log("QWebChannel初始化成功,桥接对象已就绪。");

                // 通道建立后,再绑定地图事件
                bindMapEvents();
            });
        }

        function bindMapEvents() {
            // 监听地图点击事件
            map.addEventListener('click', function(e) {
                var lng = e.point.lng;
                var lat = e.point.lat;
                console.log("JS: 点击坐标", lng, lat);

                // **调用C++ Bridge对象的槽函数**
                if (qtBridge) {
                    qtBridge.onMapClicked(lng, lat);
                } else {
                    console.error("错误:qtBridge对象未定义!");
                }
            });
        }

        // 供C++调用的JS函数:设置地图中心点
        window.setMapCenter = function(lng, lat) {
            if (map) {
                var point = new BMap.Point(lng, lat);
                map.panTo(point);
                console.log("JS: 地图中心已设置为", lng, lat);
            }
        };

        // 页面加载完成后初始化地图
        window.onload = initMap;
    </script>
</body>
</html>

在JS代码中,new QWebChannel(...)是建立连接的核心。qt.webChannelTransport是Qt注入到页面中的全局对象,无需我们定义。回调函数中的channel.objects.qtBridge,就是在获取C++端注册的那个对象。确保这里的字符串qtBridge与C++代码中的标识符完全匹配,这是双向通信能成功的第一步。

3. 实战避坑指南:五大典型问题与解决方案

理论流程走通了,但在实际开发中,你会遇到各种“诡异”的问题。下面我结合自己的踩坑经历,总结出五个最常见且棘手的问题。

3.1 网络检测与地图初始化失败

这是最让人头疼的问题之一。如果你的应用启动时设备没有网络,QWebEngineView加载依赖在线API的百度地图页面,虽然UI不会崩溃,但控制台会持续刷出网络错误,地图区域一片空白。更糟糕的是,如果你在此时尝试调用runJavaScript与地图交互,很可能导致程序崩溃。

解决方案:实现一个健壮的初始化流程。

  1. 延迟加载:不要在窗口构造函数中直接加载地图。可以添加一个bool m_mapInitialized成员变量来标记地图状态。
  2. 网络状态检测:使用QNetworkConfigurationManager检测网络状态。或者,更简单的方法是,在尝试加载地图前,先尝试加载一个简单的在线资源(如百度地图API的JS库)来探测网络。
  3. 安全调用:在所有通过runJavaScript调用地图JS函数的地方,先检查m_mapInitialized标志位。
// 在主窗口类中
class MainWindow {
    // ...
private slots:
    void tryInitializeMap();
private:
    bool m_isMapLoaded;
    QWebEngineView *m_webView;
};

void MainWindow::tryInitializeMap() {
    if (m_isMapLoaded) return;

    // 简单的网络探测(示例)
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply){
        if (reply->error() == QNetworkReply::NoError) {
            // 网络通畅,加载地图
            m_webView->setUrl(QUrl("file:///.../BDMap.html"));
            m_isMapLoaded = true;
        } else {
            // 网络不通,提示用户或禁用地图功能
            qWarning() << "网络不可用,地图功能受限。";
            // 可以显示一个占位图或提示标签
        }
        reply->deleteLater();
    });
    manager->get(QNetworkRequest(QUrl("http://api.map.baidu.com/api?v=3.0")));
}

void MainWindow::someFunctionThatInteractsWithMap() {
    if (!m_isMapLoaded) {
        qDebug() << "地图未加载,忽略操作。";
        return;
    }
    m_webView->page()->runJavaScript("window.setMapCenter(116.404, 39.915)");
}

3.2 坐标传递丢失与异步处理

当你需要批量向地图添加大量标记点(Marker)或绘制折线(Polyline)时,可能会发现有些点“消失”了,或者绘制顺序错乱。这是因为Qt调用runJavaScript是非阻塞的,它只是将任务放入队列后立即返回。如果你在循环中快速连续调用,JavaScript端可能来不及处理上一个调用,导致队列堆积甚至丢失。

解决方案:实现一个简单的“请求-响应”队列机制。

  • C++端:将要执行的JS命令和参数放入一个队列。
  • JavaScript端:每个地图操作函数(如添加标记)在执行完成后,调用一个特定的C++回调函数(通过qtBridge)。
  • 流程控制:C++端只在收到上一个操作的完成回调后,才从队列中取出下一个命令执行。

这里给出一个简化的思路示例:

在Bridge类中增加一个队列和相应的槽函数:

// bridge.h 新增
signals:
    void executeNextCommand();
public slots:
    void onJsOperationComplete();

// 在某个管理类中
void MapManager::addPoint(double lng, double lat) {
    m_commandQueue.enqueue(QString("addMarker(%1, %2)").arg(lng).arg(lat));
    if (!m_isOperating) {
        executeNextCommand();
    }
}

void MapManager::executeNextCommand() {
    if (m_commandQueue.isEmpty()) {
        m_isOperating = false;
        return;
    }
    m_isOperating = true;
    QString cmd = m_commandQueue.dequeue();
    m_webView->page()->runJavaScript(cmd);
}

// 当JS端的addMarker函数完成时,调用qtBridge.onJsOperationComplete()
void Bridge::onJsOperationComplete() {
    emit executeNextCommand(); // 触发执行下一个命令
}

3.3 页面空白与资源加载失败

程序运行后,地图区域一片空白,但打开浏览器直接访问那个HTML文件却正常。这个问题通常由以下几个原因导致:

可能原因排查方法解决方案
文件路径错误打印QUrl的完整路径,检查文件是否存在。使用QFile::exists()验证路径。发布时,确保资源文件被正确打包。
跨域问题(本地文件)浏览器控制台(F12)查看是否有CORS错误。百度地图API从http://加载,而本地HTML是file://协议。一个变通方法是使用Qt内置的本地HTTP服务器(如QHttpServer)来提供HTML文件,或者将HTML和JS部署到一个简单的本地Web服务器上。
qwebchannel.js未加载在HTML中检查<script src="qwebchannel.js">是否报404。确保qwebchannel.js与BDMap.html在同一目录,且路径正确。使用Qt资源系统时,路径应为qrc:/path/to/qwebchannel.js。
Qt WebEngine模块缺失程序启动时是否有相关错误提示。确保.pro文件中已添加QT += webenginewidgets,并且部署时带上必要的Qt WebEngine插件和资源文件。

提示:调试Web内容时,可以启用QWebEngineView的开发者工具。在MainWindow构造函数中加入:webView->page()->setDevToolsPage(webView->page());。然后运行程序,右键点击网页区域,选择“检查”,就能像在Chrome中一样调试JavaScript了。

3.4 内存泄漏与多次加载崩溃

在需要重新加载地图(比如切换城市或刷新数据)时,直接再次调用load()可能会导致内存泄漏甚至程序崩溃。这是因为QWebEnginePage和相关的渲染进程没有被妥善清理。

安全的重新加载策略:

void MainWindow::reloadMap() {
    QWebEngineView *oldView = qobject_cast<QWebEngineView*>(ui->mapContainer);
    if (oldView) {
        // 1. 断开所有连接
        disconnect(oldView, nullptr, this, nullptr);
        if (m_bridge) {
            disconnect(m_bridge, nullptr, oldView->page(), nullptr);
        }
        // 2. 删除旧的page,这是关键!
        oldView->page()->deleteLater();
        // 3. 创建新的page并重新设置
        QWebEnginePage *newPage = new QWebEnginePage(this);
        QWebChannel *newChannel = new QWebChannel(this);
        newChannel->registerObject("qtBridge", m_bridge);
        newPage->setWebChannel(newChannel);
        oldView->setPage(newPage);
        // 4. 重新加载URL
        oldView->setUrl(QUrl("..."));
        m_isMapLoaded = false; // 重置标志位
        // 5. 重新连接必要的信号槽
        // ... (例如,监听加载完成信号)
        connect(newPage, &QWebEnginePage::loadFinished, this, [this](bool ok){
            m_isMapLoaded = ok;
            qDebug() << "地图重新加载" << (ok ? "成功" : "失败");
        });
    }
}

3.5 调试困难:如何获取JavaScript的日志

在Qt中,你无法直接看到console.log()的输出。这给调试带来了巨大困难。我们之前已经在Bridge类中预留了一个jsLog槽函数,现在就来利用它。

在HTML的JavaScript中,重写console.log:

// 在BDMap.html的<script>标签内
(function() {
    var oldLog = console.log;
    console.log = function(...args) {
        // 调用原来的console.log,在开发者工具中仍能看到
        oldLog.apply(console, args);
        // 通过QWebChannel发送到Qt
        if (typeof qtBridge !== 'undefined' && qtBridge.jsLog) {
            var message = args.map(arg => String(arg)).join(' ');
            qtBridge.jsLog(message);
        }
    };
})();

// 现在,任何console.log都会在Qt的应用程序输出中显示
console.log("地图初始化开始...");
console.log("当前缩放级别:", map.getZoom());

这样,所有JavaScript中的console.log信息都会通过qtBridge.jsLog传递到C++端,并在Qt Creator的“应用程序输出”面板中显示出来,极大方便了问题定位。

4. 功能进阶:实现一个完整的交互式地图模块

掌握了基础通信和避坑技巧后,我们可以构建一个更实用的地图模块。假设我们要实现一个“轨迹回放”功能:从Qt端读取一系列GPS坐标点,在地图上平滑地绘制轨迹线并移动标记点。

C++端数据结构与逻辑:

// 轨迹点结构
struct TrackPoint {
    double longitude;
    double latitude;
    qint64 timestamp;
};

class TrackPlayer : public QObject {
    Q_OBJECT
public:
    void loadTrack(const QList<TrackPoint>& points);
    void startPlayback();
    void pausePlayback();

private slots:
    void playNextPoint();

private:
    QList<TrackPoint> m_trackPoints;
    int m_currentIndex = 0;
    QTimer *m_playTimer;
    Bridge *m_bridge;
};

void TrackPlayer::playNextPoint() {
    if (m_currentIndex >= m_trackPoints.size()) {
        m_playTimer->stop();
        return;
    }
    const TrackPoint& pt = m_trackPoints[m_currentIndex];
    // 调用JS函数,更新地图上的标记点位置,并绘制线段
    QString js = QString("updateTrackerPosition(%1, %2, %3);")
                    .arg(pt.longitude)
                    .arg(pt.latitude)
                    .arg(m_currentIndex);
    // 假设我们已经通过某种方式获取了webView的page()
    // webView->page()->runJavaScript(js);
    m_currentIndex++;
}

JavaScript端增强功能: 在BDMap.html中,我们需要定义更丰富的函数供C++调用。

// 全局变量
var trackMarker = null; // 轨迹点标记
var trackPolyline = null; // 轨迹线

// 初始化轨迹组件
function initTracker() {
    if (!trackMarker) {
        trackMarker = new BMap.Marker(new BMap.Point(0,0));
        trackMarker.setTitle("当前位置");
        map.addOverlay(trackMarker);
    }
    if (!trackPolyline) {
        trackPolyline = new BMap.Polyline([], {
            strokeColor: "#00FF00",
            strokeWeight: 3,
            strokeOpacity: 0.8
        });
        map.addOverlay(trackPolyline);
    }
}

// 供C++调用的更新函数
window.updateTrackerPosition = function(lng, lat, index) {
    if (!map) return;
    initTracker();

    var newPoint = new BMap.Point(lng, lat);
    // 移动标记
    trackMarker.setPosition(newPoint);
    // 将新点加入轨迹线
    var path = trackPolyline.getPath();
    path.push(newPoint);
    trackPolyline.setPath(path);
    // 将视图中心平滑移动到新点(可选)
    map.panTo(newPoint);

    // 操作完成后,通知C++可以发送下一个点
    if (qtBridge && qtBridge.onPlaybackStepComplete) {
        qtBridge.onPlaybackStepComplete(index);
    }
};

这个例子展示了如何将复杂的业务逻辑拆分成C++端的控制和JavaScript端的渲染,通过QWebChannel进行协同。C++负责数据管理和时序控制,JavaScript负责调用百度地图API进行高效的地图渲染和交互,两者各司其职,构成了一个高性能的混合应用。

开发这类应用,最深的体会就是耐心和系统性调试的重要性。很多问题,比如页面空白、通信失败,往往源于一个字母的大小写错误、一个路径的斜杠方向,或者一个函数调用的时机不对。务必善用我们构建的jsLog调试通道和Qt的开发者工具,它们能帮你快速定位问题所在。最后,记得在发布应用时,处理好资源文件的打包和网络状态的容错,这样你的应用才能在用户的各种环境下稳定运行。

Qt嵌入百度地图API的详细流程与常见问题 关于Qt应用嵌入地图这一块 我是好久之前就开始做了,前段时间测试的时候貌似是没问题了,可刚拉出去溜溜时就出BUG了。。。在查找BUG时发现几个坑,不小心的话还是很容易掉进去的,所以想着记录下来和大家分享一下 。关于创建这一块我也没写过,那就从工程建立开始—— 0 准备工作 开发环境 Qt5.7 MSVC2015 (我刚开始接触Qt时使用的MinGW版本 后来就是要嵌入网页时发现MinGW好像没有QWebEngine模块) 需要文件 地图文件 BDMap.html 连接工具 QwebChannel.j 阅读详情

相关推荐

qt与js交互,并在百度地图上绘制轨迹

前言: 获得了照片的GPS信息后,我们现在要做的就是把GPS信息传入JS中,然后通过百度地图API将轨迹绘制出来。 一:在程序页面加载地图 qt5.6及之后取消了QWebkits,转为使用QWebEngine. 在qt5.6的额ui设计师界面中,并不能直接找到QWebView,如果没有这个ui组件,我们就无法将浏览器嵌入到我们的程序中,就无法加载地图了,所以第一步我们要弄出一个类似的组件,...

DXZ444的博客 8385

QT调用百度地图API并根据经纬度在地图上标点以及GPS转百度地图坐标

环境 QT5.7.1+VS2015QT5.7.1已经没有webkit 组件了,取而代之的是QtWebEngine要使用QtWebEngine,需要进行以下设置1.项目-&gt;属性-&gt;c/c++-&gt;常规-&gt;附加包含目录 添加$(QTDIR)\include\QtWebEngineWidgets2.项目-&gt;属性-&gt;链接器-&gt;输入-&gt;附加依赖项 添加Qt5We...

weixin_34819401的博客 1万+

QT5项目实战:用QWebEngineView加载百度地图HTML的完整流程(附源码)

本文详细介绍了在QT5框架下使用QWebEngineView控件集成百度地图的完整工程化解决方案。从环境配置、项目结构设计到核心代码实现,提供了地图显示、路径处理、性能优化等关键技术细节,并附有源码示例,帮助开发者快速实现桌面应用中的地图功能集成。

weixin_28339967的博客 418

QT QWebEngineView加载百度地图

Qt5.5之后使用新的QWebEngineView代替了之前的QWebKit,加载数据的方式也由同步变成了异步。所以访问网站页面和加载HTML页面都需要使用QWebEngineView类。 项目要求在程序中显示地图,并能够通过串口接收无人机上图传里的GPS实时传回来的经纬度,并在地图上画出无人机的飞行轨迹。由于需要在QT中加载百度地图,所以需要用QWebEngineView进行QT与HTML/JavaScript的交互,在HTML文件中调用百度地图的API显示地图和地图上的一些控件。因为要实时显示无人机的

Sakuya__的博客 6458

Qt加载百度地图详细流程(附带报错解决方法)

一篇文章看懂Qt如何加载出百度地图......

qq_60018273的博客 1604

Qt中利用QWebEngineView与百度地图API实现动态交互式地图应用

本文详细介绍了如何在Qt中使用QWebEngineView组件集成百度地图API,实现动态交互式地图应用。通过环境配置、HTML文件创建、Qt与JavaScript通信实现等步骤,开发者可以快速构建功能丰富的地图应用,包括地图显示、标记点添加、实时轨迹绘制等高级功能。文章还提供了性能优化和常见问题解决方案,帮助开发者提升应用性能和稳定性。

weixin_29019241的博客 657

QT5.9 利用 QWebEngineView / QWebChannel 调用JavaScript 实现QT与HTML网页数据交互, 实现QT加载百度地图并与地图交互数据

QT5.9 利用 QWebEngineView / QWebChannel 调用JavaScript 实现QT与HTML网页数据交互, 实现QT加载百度地图并与地图交互数据 编译环境 QT5.9.3 + VS2015 64/32bit +win10 (MinGW默认不支持 QWebEngineView) 先看软件截图: 实现功能: 1.QT通过QWebEngineView模块加载百度地...

qq_43569273的博客 1万+

Qt集成百度地图API实战:从零搭建到双向通信优化

本文详细介绍了在Qt桌面应用中集成百度地图API的完整实战流程。通过使用QWebEngineView控件加载地图网页,并利用QWebChannel技术建立C++与JavaScript之间的双向通信桥梁,实现了地图显示、坐标传递与定位等核心功能。文章重点分享了从环境配置、项目搭建到通信优化、异常处理及批量数据绘制的全链路解决方案,帮助开发者高效构建稳定可靠的桌面地图应用。

weixin_29297127的博客 530

Qt下使用QWebEngineView实现百度地图的显示

本文讲述了Qt下QWebEngineView与javaScript的交互调用,在网络连接下实现百度地图的显示。

XCJandLL的博客 5450

保姆级教程:在QT 5.13中用QWebEngineView加载百度地图并实现双向交互(附完整源码)

本文详细介绍了在QT 5.13中使用QWebEngineView加载百度地图并实现双向交互的完整流程,包括环境配置、QWebChannel通信机制、双向交互实战及性能优化技巧。通过具体代码示例和避坑指南,帮助开发者高效整合QT与百度地图JavaScript API,实现桌面应用与在线地图服务的深度交互。

weixin_30352645的博客 498

Qt加载百度地图实现地图浏览(一)

在使用Qt中的QWebEngineView实现加载百度地图,并提供地图浏览功能。用户可以在Qt应用程序中显示百度地图,并使用常见的地图操作(如缩放、平移等)进行交互。

4068

【QT--使用百度地图API显示地图并绘制路线】

先吐槽一下下,本身qt学的就不咋滴,谁想到第一件事就是让写一个上位机工具,根据CAN总线传来的位置信息,在地图上去绘制路线,并获取当前路段的限速信息等。当听到这个需求的时候,第一时间是有点懵逼的。自己原本是没接触过这方面的知识,而且qt学的也特别的垃圾,但是以我的性格还是答应了下来。最终也是花了几天的时间做了出来。通过做这个简单的小工具,自己也学到了还能多。接下来我就简单说一说如何使用百度地图API来显示地图并根据位置信息绘制路线这一功能。其他的就不方便说了。

a1379292747的博客 7222

Qt应用与百度地图API交互实战指南

在当今快速发展的IT行业,跨平台开发框架如Qt,因其强大的功能和高效的性能而受到广泛欢迎。本章节将对Qt框架进行简要介绍,并探讨如何与百度地图API结合,以增强应用程序的地理空间分析能力。Qt是一个跨平台的C++应用程序框架,广泛用于开发具有图形用户界面的应用程序。它提供了一整套工具和库,包括但不限于窗口部件、2D/3D图形渲染、网络通信、数据库集成以及多线程等。Qt的核心优势在于它能够创建可在多种操作系统(如Windows、macOS、Linux等)上运行的应用程序,无需对代码进行大量修改。

weixin_33375360的博客 1807

QT5百度地图开发学习——地图显示

文章目录前言一、工程创建二、地图显示1.pro文件更改2.载入地图显示3.特别注意总结 前言 当qt5+MSVC环境搭建成功和将baidumap.html,qwebchannel.js准备好之后,我们可以开始进行开发啦,不过在此之前,你可能需要学习一下QT5知识,在这里是默认你会一定的Qt知识与JavaScript知识。 一、工程创建 首先新建一个qt项目,这个就不赘述了。建好之后如图所示: 在其根目录下放入baidumap.html,qwebchannel.js文件。如图: 还是要注意上一个文档中

qq_40420104的博客 7837

PMD相位偏折术实战:如何用Python处理条纹图,让金属外壳的划痕无处遁形

本文详细介绍了PMD相位偏折术在金属外壳划痕检测中的应用,通过Python实现条纹图处理和局部特征增强技术,显著提升微小缺陷的检出率。文章涵盖从四步相移条纹图采集到形状图局部增强的完整流程,特别适合工业质检场景,帮助实现高精度、高效率的自动化检测。

weixin_29291573的博客 509

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6684

QT5 QWebEngineView实现离线百度地图API:项目的核心功能/场景

QT5 QWebEngineView实现离线百度地图API:项目的核心功能/场景 【下载地址】QT5QWebEngineView实现离线百度地图API 该项目展示了如何在QT5环境中使用QWebEngineView控件集成离线百度地图API,为开发者提供了一种无需依赖网络即可实现地图功能的高效解决方案。资源包包含完整的示...

gitblog_06798的博客 631

保姆级教程:用STM8S207R6和FD6288T自制BLDC驱动板,从原理图到代码框架搭建

本文提供了一份详细的STM8S207R6和FD6288T自制BLDC驱动板教程,涵盖从原理图设计到代码框架搭建的全过程。通过硬件选型、电源电路设计、PWM定时器配置等关键步骤解析,帮助开发者快速掌握无刷直流电机驱动技术,实现高效稳定的电机控制方案。

weixin_28729205的博客 487

探索Qt与百度地图API的完美结合:Qt5.14.0实现百度地图API调用指南

探索Qt与百度地图API的完美结合:Qt5.14.0实现百度地图API调用指南 【下载地址】Qt5.14.0实现百度地图API调用指南 本仓库致力于展示如何在Qt 5.14.0框架下集成百度地图API,通过利用QWebEngineView组件来加载并显示地图网页。项目专注于物体轨迹管理,包括设计、插入、删除、保存与读取等...

gitblog_09700的博客 1645

【Xilinx】如何在petalinux下编译vcu-gst-app以及独立编译vcu-gst-app

Xilinx从2018.1开始,提供了一套基于zcu106的vcu参考设计。里面提供了一套基于GStreamer的程序,即vcu-gst-app。如何脱离petalinux直接编译呢,这里以为例,其他版本也是类似的操作。

王师傅 3039

基于任务的后勤智能体:三段构建与演进设计探究

这是系统智能化的核心难点。例如,对于一个“加强连级滩头阵地防御”子任务,系统会根据防御时长、预期敌军攻击强度、地形等因素,计算出所需的弹药(不同弹种的具体数量)、构筑工事的器材、人员的给养和饮水量、以及医疗救护的药品和血包数量。首先进行分词、词性标注等基础处理,然后利用在军事语料库上训练的命名实体识别(NER)模型,提取出关键实体,如任务类型(“夺控作战”)、作战对象(“Y岛”)、时间约束(“D日H时”、“24小时内”)、成功标准(“建立稳固滩头阵地”)、保障重点(“弹药充足”、“及时救治”)等。

weixin_49042442的博客 1088

[QT] QT加载百度在线地图(一)

一般步骤 在百度地图开发者网站中获取密钥 在QT中创建示例工程 创建网页index.html 运行 参考 一、在百度地图开发者网站中获取密钥 选择Javascript API 完成以下三步 在控制台->我的应用里便可以查看自己应用的Key 二、在QT中创建示例工程 需要注意的点是, 必须选择MSVC编译 在pro文件中添加QT += webenginewidgets 将Widget控件提升为QWebEngineView 在路径G:\QT\Qt_data\Examples\Qt-

qq_39295354的博客 1万+

用 SAP XCO XLSX 模块优雅读 Excel:坐标、选择模式与实战案例全解析

SAP ABAP Cloud 中的 XCO XLSX 模块为 Excel 文件处理提供了官方解决方案。文章介绍了三个核心概念:通过 XCO_CP_XLSX=>DOCUMENT 获取文档句柄;使用 CL_XCO_XLSX_COORDINATE 坐标系统定位单元格;利用 Selection Pattern 精确读取数据区域。这些功能在 RAP 批量导入等业务场景中尤为实用,相比传统方案更加简洁可靠。文章还分享了真实项目中的最佳实践,如动态列定位和相对偏移技巧,帮助开发者构建更健壮的 Excel 导入逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 191

Qt QWebEngineView加载百度地图,根据经纬度或位置刷新

1.首先需要在百度地图开发者页面注册并获取密钥 打开百度地图开发平台:http://lbsyun.baidu.com/ 登录百度账户 点击控制台,打开控制台页面 在控制台页面,创建应用 5.白名单输入* 6.提交之后就可以看到密钥了 2.使用密钥获取html并显示 <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-sacale=1.

qq_24127015的博客 3550

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 545

LVGL core group焦点分组管理(lv_group.c)

lv_group_t是用于焦点管理的,将需要获取焦点的对像加入到同一个分组内,再将其通过挂到指定的事件驱动中,就可以控制焦点了。而被加入的对象又可以通过焦点状态事件和事件来控制对象的焦点逻辑了。创建好的分组通过接口挂事件驱动中,这样就可以指定一个自定义的焦点分组了。;) {if(!} }友情提示:无论是接口还是都是单例的,即被设置后前一个被设置的值就失效了;此方案可以保证焦点的唯一 性,但也一定要记住要在适合的位置设置回来,以防丢失焦点。

Bigan(安)的博客 3905
上一篇: 从PTA题目看回文字符串:5种不同编程语言的实现对比(Python/Java/C++/Go/JavaScript)
下一篇: YOLOv11的HIFA模块实战:如何用全局信息融合提升医学图像分割精度(附代码)
普通网友
博客等级 码龄27年 204粉丝 1502原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值