天天看點

Qt編寫地圖綜合應用20-多浏覽器核心

一、前言

本人寫Qt程式這麼多年,比較喜歡支援多個Qt版本,尤其是鐘情于支援任意Qt版本+任意系統+任意編譯器,這句話說起來簡單其實實作起來就不容易了,首先你得有個很多版本的測試環境,起碼十幾個Qt環境要的吧,四五種作業系統要的吧,還要安裝各種VS版本免不了的,畢竟win上除了預設的mingw編譯器還有很多人用的是msvc編譯器,這麼一大堆環境折騰下來,沒有個1T硬碟是不夠的,而且官網釋出Qt版本的速度相當快,最慢半年肯定來一個版本,又得測試了,每次釋出一個大的版本,除了常用的windows以外,linux要測試吧,而且現在還多出來一些國産linux系統比如deepin new start UOS之類的,也要試試吧,哎呀好累。

下面是部分代碼:

//公用初始化浏覽器控件配置
void WebHelper::initWebSetting()
{
    //全局配置隻需要設定一次就行
    static bool isInit = false;
    if (!isInit) {
        isInit = true;
#ifdef webkit
        QWebSettings *webSetting = QWebSettings::globalSettings();
        webSetting->setAttribute(QWebSettings::JavascriptEnabled, true);
        webSetting->setAttribute(QWebSettings::PluginsEnabled, true);
        webSetting->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);
#elif webengine
        QWebEngineSettings *webSetting = QWebEngineSettings::globalSettings();
        webSetting->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
        webSetting->setAttribute(QWebEngineSettings::PluginsEnabled, true);
        webSetting->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true);
#endif
    }
}

//通用浏覽器元件加載
void frmMapBoundary::loadMap(bool tool)
{
    QString content;
    QString fileName = QString("%1/map_web.html").arg(AppPath);
    QString url = "file:///" + fileName;

    baidu->reset();
    baidu->setMapZoom(10);
    baidu->setShowOverlayTool(tool);

    //設定預設的中心點坐标,建議采用中心點坐标的方式
    baidu->setMapCenterPoint("121.414,31.1828");

    //如果采用加載内容方式則需要先設定不存儲檔案
    //ie核心以及在linux上需要用load的方式加載
    //發現 Qt5.5 webkit 也需要用檔案加載
#ifdef savehtmlfile
    baidu->setSaveFile(true);
#else
    baidu->setSaveFile(false);
#endif

    baidu->setFileName(fileName);
    content = baidu->newMap();

    //下面為兩種方式加載網頁,如果内容為空則加載網頁檔案否則加載内容
    //一般為了保密建議加載内容,這樣看不到生成的網頁檔案
    //可能在linux上的webkit核心需要用load的方式加載
    if (baidu->getSaveFile()) {
#if (defined webkit) || (defined webengine)
        webView->load(QUrl(url));
#elif webie
        webView->dynamicCall("Navigate(const QString&)", url);
#endif
    } else {
        QUrl baseUrl(QString("%1/").arg(AppPath));
#if (defined webkit) || (defined webengine)
        webView->setHtml(content, baseUrl);
#endif
    }
}

//通用資料互動類
//需要自定義繼承自QObject的類來接收QWebEngineView互動資料,不然會列印很多煩人的資訊
class WebJsData : public QObject
{
    Q_OBJECT
public:
    static WebJsData *Instance();
    explicit WebJsData(QObject *parent = 0);

public slots:
    //定義兩個參數,這樣就涵蓋了所有的情況 type表示類型相當于唯一辨別
    void receiveData(const QString &type, const QVariant &data);

signals:
    void receiveDataFromJs(const QString &type, const QVariant &data);
};

WebJsData *WebJsData::Instance()
{
    static WebJsData self;
    return &self;
}

WebJsData::WebJsData(QObject *parent)
{
}

void WebJsData::receiveData(const QString &type, const QVariant &data)
{
    //可以在這裡重新梳理好再發出去信号
    emit receiveDataFromJs(type, data);
}           

二、功能特點

  1. 同時支援線上地圖和離線地圖兩種模式。
  2. 同時支援webkit核心、webengine核心、IE核心。
  3. 支援設定多個标注點,資訊包括名稱、位址、經緯度。
  4. 可設定地圖是否可單擊、拖動、滑鼠滾輪縮放。
  5. 可設定協定版本、秘鑰、主題樣式、中心坐标、中心城市、地理編碼位置等。
  6. 可設定地圖縮放比例和級别,縮略圖、比例尺、路況資訊等控件的可見。
  7. 支援地圖互動,比如滑鼠按下擷取對應位置的經緯度。
  8. 支援查詢路線,可設定起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
  9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
  10. 可設定行政區劃,指定某個城市區域繪制圖層,線上地圖自動輸出行政區劃邊界點集合到js檔案給離線地圖使用。
  11. 可靜态或者動态添加多個覆寫物。支援點、折線、多邊形、矩形、圓形、弧線、點聚合等。
  12. 函數接口友好和統一,使用簡單友善,就一個類。
  13. 支援js動态互動添加點、删除點、清空點、重置點,不需要重新整理頁面。
  14. 支援任意Qt版本、任意系統、任意編譯器。

三、體驗位址

  1. 國内站點: https://gitee.com/feiyangqingyun
  2. 國際站點: https://github.com/feiyangqingyun
  3. 個人首頁: https://blog.csdn.net/feiyangqingyun
  4. 知乎首頁: https://www.zhihu.com/people/feiyangqingyun/

四、效果圖

Qt編寫地圖綜合應用20-多浏覽器核心