最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt編寫地圖之實現(xiàn)跨平臺功能

 更新時間:2022年02月15日 11:26:46   作者:feiyangqingyun  
這篇文章主要介紹了如何利用Qt編寫地圖應(yīng)用時實現(xiàn)跨平臺功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、前言

跨平臺著實花了不少的精力,為了從Qt4.7兼容到Qt6.2及后續(xù)版本,頭發(fā)掉了不少,僅有的幾根毛所剩無幾,哎,可能這就是程序員的命,本人寫Qt程序這么多年,比較喜歡支持多個Qt版本,尤其是鐘情于支持任意Qt版本+任意系統(tǒng)+任意編譯器,這句話說起來簡單其實實現(xiàn)起來就不容易了,首先你得有個很多版本的測試環(huán)境,起碼十幾個Qt環(huán)境要的吧,四五種操作系統(tǒng)要的吧,還要安裝各種VS版本免不了的,畢竟win上除了默認的mingw編譯器還有很多人用的是msvc編譯器,這么一大堆環(huán)境折騰下來,沒有個1T硬盤是不夠的,而且官網(wǎng)發(fā)布Qt版本的速度相當(dāng)快,最慢半年肯定來一個版本,又得測試了,每次發(fā)布一個大的版本,除了常用的windows以外,linux要測試吧,而且現(xiàn)在還多出來一些國產(chǎn)linux系統(tǒng)比如deepin new start UOS之類的,也要試試吧,哎呀好累。

二、功能特點

1 省市區(qū)域地圖封裝類功能特點

  1. 同時支持閃爍點圖、遷徙圖、區(qū)域地圖、世界地圖、儀表盤等。
  2. 可以設(shè)置標(biāo)題、提示信息、背景顏色、文字顏色、線條顏色、區(qū)域顏色等各種顏色。
  3. 可設(shè)置城市的名稱、值、經(jīng)緯度 集合。
  4. 可設(shè)置地圖的放大倍數(shù)、是否允許鼠標(biāo)滾輪縮放。
  5. 內(nèi)置世界地圖、全國地圖、省份地圖、地區(qū)地圖,可以精確到縣,所有地圖全部離線使用。
  6. 內(nèi)置了各省市json數(shù)據(jù)文件轉(zhuǎn)js文件功能,如有數(shù)據(jù)更新自行轉(zhuǎn)換即可,支持單個文件轉(zhuǎn)換和一鍵轉(zhuǎn)換所有文件。
  7. 內(nèi)置了從json文件或者js文件獲取該區(qū)域的所有名稱和經(jīng)緯度信息集合的功能,可以通過該方法獲取到信息用來顯示。
  8. 依賴瀏覽器組件顯示地圖,提供的demo支持webkit/webengine/miniblink/ie 多種方式加載網(wǎng)頁。
  9. 采用miniblink瀏覽器內(nèi)核打通了Qt5.6及后續(xù)版本+mingw編譯器缺少瀏覽器模塊的遺憾,使得整個項目支持所有Qt版本,親測4.7到6.2等任意版本。
  10. 閃爍點遷徙圖等設(shè)置的點支持單獨設(shè)置顏色。
  11. 提供接口直接獲取點擊的點相關(guān)信息,方便程序聯(lián)動處理。
  12. 拓展性極強,可以依葫蘆畫瓢自行增加各種精美的echarts組件,做出牛逼的效果。
  13. 內(nèi)置的儀表盤組件提供交互功能,demo演示中包含了對應(yīng)的代碼。
  14. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  15. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

2 百度地圖封裝類功能特點

  1. 同時支持在線地圖和離線地圖兩種模式。
  2. 同時支持webkit內(nèi)核、webengine內(nèi)核、miniblink內(nèi)核、IE內(nèi)核。
  3. 支持設(shè)置多個標(biāo)注點,信息包括名稱、地址、經(jīng)緯度。
  4. 可設(shè)置地圖是否可單擊、拖動、鼠標(biāo)滾輪縮放。
  5. 可設(shè)置協(xié)議版本、秘鑰、主題樣式、中心坐標(biāo)、中心城市、地理編碼位置等。
  6. 可設(shè)置地圖縮放比例和級別,縮略圖、比例尺、路況信息等控件的可見。
  7. 支持地圖交互,比如鼠標(biāo)按下獲取對應(yīng)位置的經(jīng)緯度。
  8. 支持查詢路線,可設(shè)置起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
  9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
  10. 可設(shè)置行政區(qū)劃,指定某個城市區(qū)域繪制圖層,在線地圖自動輸出行政區(qū)劃邊界點集合到j(luò)s文件給離線地圖使用。
  11. 可靜態(tài)或者動態(tài)添加多個覆蓋物。支持點、折線、多邊形、矩形、圓形、弧線、點聚合等。
  12. 提供函數(shù)接口處理經(jīng)緯度解析成地址和地址解析成經(jīng)緯度坐標(biāo)。
  13. 提供的demo直接可以單獨選點執(zhí)行對應(yīng)的處理比如路線查詢。
  14. 可以拿到路線查詢到的點坐標(biāo)信息集合,比如用于機器人坐標(biāo)導(dǎo)航等。
  15. 封裝了豐富的函數(shù)比如刪除指定點和所有點,刪除指定覆蓋物和所有覆蓋物等。
  16. 標(biāo)注點彈框信息可以自定義內(nèi)容,標(biāo)準html格式。
  17. 標(biāo)注點單擊事件可選 0-不處理 1-自己彈框 2-發(fā)送信號。
  18. 標(biāo)注點可設(shè)置動畫效果 0-不處理 1-跳動 2-墜落
  19. 標(biāo)注點可設(shè)置本地圖片文件等。
  20. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  21. 支持js動態(tài)交互添加點、刪除點、清空點、重置點,不需要刷新頁面。
  22. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

3 離線地圖下載類功能特點

  1. 多線程同步下載多級別瓦片地圖,不卡界面。
  2. 內(nèi)置多個離線地圖下載請求地址,自動隨機選擇一個發(fā)送請求。
  3. 下載地圖類型同時支持街道圖和衛(wèi)星圖。
  4. 自動計算可視區(qū)域或者行政區(qū)域的下載瓦片數(shù)量。
  5. 下載的級別可以自定義范圍和選擇。
  6. 每個瓦片下載完成都發(fā)送信號通知,參數(shù)包括下載用時。
  7. 可設(shè)置下載最大超時時間,超過了則丟棄跳到下一個下載任務(wù)。
  8. 實時顯示下載進度,以及當(dāng)前級別已經(jīng)下載的瓦片數(shù)和總瓦片數(shù)。
  9. 下載過程中可以停止下載,下載完成自動統(tǒng)計總用時。
  10. 內(nèi)置經(jīng)緯度和屏幕坐標(biāo)互相轉(zhuǎn)換函數(shù)。
  11. 目前支持百度地圖,其他地圖比如谷歌地圖、騰訊地圖、高德地圖可以定制。
  12. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  13. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

4 省市輪廓下載類功能特點

  1. 定時器排隊下載省市輪廓圖點坐標(biāo)集合存儲到JS文件。
  2. 支持一個行政區(qū)域多個不規(guī)則區(qū)域下載。
  3. 自動計算行政區(qū)域的下載輪廓數(shù)量。
  4. 可精確選擇省份、市區(qū)、縣城,也可直接輸入行政區(qū)域的名稱。
  5. 可以設(shè)置下載間隔、隨時開始下載和停止下載。
  6. 提供編輯邊界功能,可以直接在地圖上編輯好不規(guī)則區(qū)域的點集合,然后獲取邊界點集合數(shù)據(jù),這個可以用來自己繪制區(qū)域拿到數(shù)據(jù),比如某個鄉(xiāng)鎮(zhèn)甚至某個小區(qū)的行政區(qū)域數(shù)據(jù),很牛逼。

三、體驗地址

體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg  提取碼:uyes 文件名:bin_map.zip

國內(nèi)站點:https://gitee.com/feiyangqingyun

國際站點:https://github.com/feiyangqingyun

四、效果圖

五、相關(guān)代碼

#include "webview.h"
#include "qevent.h"
#include "qdatetime.h"
#include "qdebug.h"

#ifdef webkit
#include <QtWebKit>
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include <QtWebKitWidgets>
#endif
#elif webengine
#include <QtWebEngineWidgets>
#elif webie
#include <QAxWidget>
#elif webminiblink
#include "miniblink.h"
#endif

#define TIMEMS qPrintable(QTime::currentTime().toString("HH:mm:ss zzz"))
WebView::WebView(QWidget *parent) : QObject(parent)
{
    //初始化web控件配置信息
    WebView::initWebSetting();
    //初始化通用地圖數(shù)據(jù)
    WebHelper::initMapData();

    //數(shù)據(jù)交互類
    webJsData = new WebJsData(this);
    connect(webJsData, SIGNAL(receiveDataFromJs(QString, QVariant)),
            this, SIGNAL(receiveDataFromJs(QString, QVariant)));

#ifdef webkit
    webView = new QWebView(parent);
#elif webengine
    webView = new QWebEngineView(parent);
    //設(shè)置對應(yīng)的通信通道
    QWebChannel *channel = new QWebChannel(this);
    channel->registerObject("objName", webJsData);
    webView->page()->setWebChannel(channel);
#elif webie
    webView = new QAxWidget(parent);
    //注冊瀏覽器控件
    webView->setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}");
    //不顯示警告信息
    webView->setProperty("DisplayAlerts", false);
    //不顯示滾動條
    webView->setProperty("DisplayScrollBars", true);
#elif webminiblink
    webView = new miniblink(parent);
#endif

    //關(guān)聯(lián)加載完成信號
#if (defined webkit) || (defined webengine)
    connect(webView->page(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished()));
    connect(webView->page(), SIGNAL(loadFinished(bool)), this, SIGNAL(loadFinished(bool)));
#elif webminiblink
    connect(webView, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished()));
    connect(webView, SIGNAL(loadFinished(bool)), this, SIGNAL(loadFinished(bool)));
    connect(webView, SIGNAL(receiveDataFromJs(QString, QVariant)),
            this, SIGNAL(receiveDataFromJs(QString, QVariant)));
#endif

    //設(shè)置沒有右鍵菜單
#if (defined webkit) || (defined webengine) || (defined webie) || (defined webminiblink)
    webView->setContextMenuPolicy(Qt::NoContextMenu);
#endif

    //安裝事件過濾器
#ifdef webminiblink
    webView->installEventFilter(this);
#endif
}

void WebView::initWebSetting()
{
    //全局配置只需要設(shè)置一次就行
    static bool isInit = false;
    if (!isInit) {
        isInit = true;
        QString webcore = "other";
#ifdef webkit
        webcore = "webkit";
        QWebSettings *webSetting = QWebSettings::globalSettings();
        webSetting->setAttribute(QWebSettings::JavascriptEnabled, true);
        webSetting->setAttribute(QWebSettings::PluginsEnabled, true);
        webSetting->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);
#elif webengine
        webcore = "webengine";
        QWebEngineSettings *webSetting = QWebEngineProfile::defaultProfile()->settings();
        webSetting->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
        webSetting->setAttribute(QWebEngineSettings::PluginsEnabled, true);
        webSetting->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true);
#elif webie
        webcore = "ie";
#elif webminiblink
        webcore = "miniblink";
#endif
        qDebug() << TIMEMS << QString("init webview ok, core: %1").arg(webcore);
    }
}

bool WebView::eventFilter(QObject *watched, QEvent *event)
{
    //測試發(fā)現(xiàn)miniblink內(nèi)核(其他內(nèi)核正常),網(wǎng)頁中的右鍵有消息會傳給父類
    if (event->type() == QEvent::MouseButtonPress) {
        return true;
    }
    return QObject::eventFilter(watched, event);
}

void WebView::setLayout(QLayout *layout)
{
    //把控件加入到布局
#if (defined webkit) || (defined webengine) || (defined webie) || (defined webminiblink)
    layout->addWidget(webView);
#endif
}

void WebView::setVisible(bool visible)
{
#if (defined webkit) || (defined webengine) || (defined webie) || (defined webminiblink)
    webView->setVisible(visible);
#endif
}

void WebView::setBgColor(const QColor &color)
{
#if (defined webkit) || (defined webie)
    webView->setStyleSheet(QString("background:%1;").arg(color.name()));
#elif (defined webengine)
    webView->page()->setBackgroundColor(color);
#elif (defined webminiblink)
    webView->setBgColor(color);
#endif
}

void WebView::loadFinished()
{
#ifdef webkit
    webView->page()->mainFrame()->addToJavaScriptWindowObject("objName", webJsData);
#endif
}

void WebView::load(const QString &url, const QString &html, const QString &baseUrl)
{
    //如果存在網(wǎng)址則優(yōu)先直接加載網(wǎng)址
    if (!url.isEmpty()) {
#if (defined webkit) || (defined webengine)
        webView->load(QUrl(url));
#elif webie
        webView->dynamicCall("Navigate(const QString&)", url);
#elif webminiblink
        webView->load(url);
#endif
    } else {
#if (defined webkit) || (defined webengine)
        webView->setHtml(html, QUrl(baseUrl));
#elif webminiblink
        webView->setHtml(html, baseUrl);
#endif
    }
}

void WebView::runJs(const QString &js)
{
    if (js.isEmpty()) {
        return;
    }
#ifdef webkit
    webView->page()->mainFrame()->evaluateJavaScript(js);
#elif webengine
    webView->page()->runJavaScript(js);
#elif webminiblink
    webView->runJs(js);
#endif
}

以上就是Qt編寫地圖之實現(xiàn)跨平臺功能的詳細內(nèi)容,更多關(guān)于Qt地圖 跨平臺的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++歸并排序詳解

    c++歸并排序詳解

    歸并排序遵循分治法的思想:將原問題分解為幾個規(guī)模較小但類似于原問題的子問題,遞歸地求解這些子問題,然后再合并這些子問題的解來建立原問題的解。分治模式在每層遞歸時都有三個步驟:分解、解決、合并。歸并排序完全遵循該模式。
    2017-05-05
  • C語言實現(xiàn)學(xué)生管理系統(tǒng)總結(jié)

    C語言實現(xiàn)學(xué)生管理系統(tǒng)總結(jié)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++中多線程間共享數(shù)據(jù)詳解

    C++中多線程間共享數(shù)據(jù)詳解

    這篇文章主要為大家詳細介紹了C++中多線程間共享數(shù)據(jù)的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C/C++實現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)

    C/C++實現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)

    C/C++實現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C語言實現(xiàn)雙向鏈表

    C語言實現(xiàn)雙向鏈表

    本文給大家分享的是一段使用C語言實現(xiàn)雙向鏈表的代碼,完全是根據(jù)自己的理解和認識來編寫的,希望大家能夠喜歡,文章的最后附上了一個網(wǎng)友寫的對于雙向鏈表刪除節(jié)點、插入節(jié)點、雙向輸出等操作的代碼,也非常不錯,推薦給大家
    2015-03-03
  • C語言中動態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語言中動態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語言跟內(nèi)存申請相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等,下面這篇文章主要給大家介紹了關(guān)于C語言中動態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • VC實現(xiàn)給窗體的一個按鈕添加事件的方法

    VC實現(xiàn)給窗體的一個按鈕添加事件的方法

    這篇文章主要介紹了VC實現(xiàn)給窗體的一個按鈕添加事件的方法,通過三個簡單步驟實現(xiàn)窗體按鈕添加事件,需要的朋友可以參考下
    2015-05-05
  • C語言中二叉樹的后序遍歷詳解

    C語言中二叉樹的后序遍歷詳解

    大家好,本篇文章主要講的是C語言中二叉樹的后序遍歷詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • cmake 學(xué)習(xí)筆記

    cmake 學(xué)習(xí)筆記

    這篇文章主要介紹了作者學(xué)習(xí)cmake 的相關(guān)資料與心得,有需要的小伙伴可以參考下
    2017-07-07
  • C++之&與*符號用法案例詳解

    C++之&與*符號用法案例詳解

    這篇文章主要介紹了C++之&與*符號用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

边坝县| 安阳市| 丰镇市| 琼中| 五指山市| 丹东市| 通州市| 泊头市| 墨玉县| 鄂托克前旗| 古丈县| 珠海市| 上林县| 汝州市| 颍上县| 苏州市| 辉南县| 长春市| 亚东县| 桑植县| 九江市| 桃源县| 昌邑市| 陵水| 历史| 沭阳县| 和田市| 周至县| 德保县| 嘉定区| 万山特区| 尉氏县| 新化县| 库尔勒市| 望谟县| 阿城市| 萝北县| 海伦市| 乌拉特中旗| 潼关县| 巍山|