QT+HTML+JS百度离线地图--连接qt并移植到麒麟系统

        毕竟目标是在软件里显示,所以还是要和qt结合起来使用,并且这是个国产化项目所以还需要移植到麒麟系统。我这边使用的麒麟系统是麒麟国防版V10。

一.html连接qt

      1.html文件位置

        先说一下qt加载html,html文件需要放在哪,如下图

        html目录需要放在构建目录下,之后在qt负责加载地图的类中设置html读取路径,获取绝对路径。

// 设置 HTML 文件路径
    QString mapPath = QDir::currentPath() + "/Map/jinmenMap.html";
    m_webView->setUrl(QUrl::fromLocalFile(mapPath));

      2.在qt中显示地图

        

        接下来,我们来讨论如何在 Qt 中显示 HTML 界面。

        首先,需要在 .pro 文件中添加两个模块:webengine 和 webenginewidgets

webengine:

        该模块包含了 Qt WebEngine 的核心功能,基于 Chromium 项目,提供了一个现代的网页浏览器引擎。它允许在 Qt 应用程序中嵌入和显示网页内容(包括 HTML、CSS、JavaScript 等)。

webenginewidgets:

        该模块基于 webengine,提供了一组用于在 Qt Widget 界面中嵌入网页的控件,如 QWebEngineViewwebenginewidgets 使得你可以轻松地将网页嵌入到标准的 Qt 窗口部件中,并与 Qt 的其他控件进行交互。

        注意版本:我使用的是 Qt 5.15.2 + VS2019,使用 Qt 5.12.2 + VS2017 也是可以的,但需要注意使用 MSVC 编译器,否则没有 webengine 组件。此外,webengine 组件在安装 Qt 时需要在组件列表中手动勾选,默认是未勾选的。

        之后,我们可以在 Qt 中显示地图。我创建了一个 createMap 类,专门用于显示 HTML 界面,并创建了相应的 .h.cpp 和 .ui 文件。

创建一个widget对象,地图将会在widget对象上显示,并将其提升为QWebEngineView

        在头文件中加入#include <QWebEngineView>,在.cpp中并显示地图

QWebEngineView *m_webView;
m_webView = ui->createMap;

// 设置 HTML 文件路径
QString mapPath = QDir::currentPath() + "/Map/jinmenMap.html";
m_webView->setUrl(QUrl::fromLocalFile(mapPath));

// 调整 webView 大小以适应父窗口
m_webView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_webView->setZoomFactor(1.0);

        在 main 函数中,可以将展示 mainwindow.ui 窗口的 w.show(); 修改为展示 createMap.ui 窗口,以测试是否能够正常显示。

        我希望实现的效果是 MainWindow 作为主窗口,可以查看 createMap 的缩略图,且缩略图能够放大至全屏,全屏状态下也能缩小回缩略图。无论是缩略图还是全屏状态下,都应能够使用 HTML 的所有功能。

        下面是放大和缩小按钮的槽函数代码,缩小按钮设计在了 createMap.ui 下。放大按钮的功能无需赘述,缩小按钮通过信号槽通知主窗口处理缩小逻辑。

//放大窗口按钮槽函数
void MainWindow::on_amplifyMap_clicked()
{
    QApplication::setOverrideCursor(Qt::WaitCursor);

    ui->thumbnailView->hide();

    m_createMap->setParent(this);
    m_createMap->hide();
    m_createMap->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);

    QSize parentSize = this->size();
    QPoint parentCenter = QPoint(parentSize.width() / 2, parentSize.height() / 2);

    m_createMap->resize(parentSize);

    m_createMap->show();

    m_createMap->raise();
    m_createMap->activateWindow();

    QApplication::restoreOverrideCursor();
    ui->amplifyMap->setEnabled(false);
}

// 缩小按钮槽函数
void MainWindow::slot_reduceMap()
{

    QApplication::setOverrideCursor(Qt::WaitCursor);

    m_createMap->setParent(ui->thumbnailView);
    m_createMap->resize(ui->thumbnailView->size());
    m_createMap->move(0, 0);

    m_createMap->show();
    ui->thumbnailView->show();
    ui->amplifyMap->setEnabled(true);

    // 增加延迟,以确保缩略图大小已经稳定
    QTimer::singleShot(100, [=]() {
        QApplication::restoreOverrideCursor();
    });
}

        最后在mainwindow中加入初始化地图调用即可。

void MainWindow::initMap()
{
    if (!m_createMap) {
        m_createMap = new createMap(this);
        m_createMap->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
        m_createMap->setParent(this);
    }

    m_createMap->resize(ui->thumbnailView->size()); // 调整大小
    m_createMap->move(ui->thumbnailView->pos());    // 调整位置
    m_createMap->show();
    ui->thumbnailView->show();                      // 重新显示缩略图视图
}

二,麒麟系统移植

        之后就是把代码移植到麒麟系统中,首先,html代码是使用原生html+js写的,没有用任何框架,所以这一点在平台移植上会比较方便。麒麟系统和linux系统很接近,但是网上对于麒麟系统的描述很少,尤其是解决问题方面。麒麟系统的qt使用的是gcc编译器,也拥有webengine 和 webenginewidgets模块,但是直接把代码放上去的话会报错,内容为:

libQt5WebEngineCore.so: .dynsym local symbol at index 3 (>= sh_info of 3)
libQt5WebEngineCore.so: .dynsym local symbol at index 4 (>= sh_info of 3)
libQt5WebEngineCore.so: .dynsym local symbol at index 5 (>= sh_info of 3)
libQt5WebEngineCore.so: .dynsym local symbol at index 6 (>= sh_info of 3)

        这里直接说解决方法:

sudo ln -sf /usr/bin/x86_64-linux-gnu-ld.gold /usr/bin/ld

        好了,解决了,移植完成,其实并没出太多太难解决的问题,随着开发可能会出现更多问题,等到时候都会说。

        后续的文章将会讲述如何在地图中绘制点线、设置图片、测距,以及实现 Qt 与 JavaScript 之间的数据传递等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值