一、前言
本人寫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);
}
二、功能特點
- 同時支援線上地圖和離線地圖兩種模式。
- 同時支援webkit核心、webengine核心、IE核心。
- 支援設定多個标注點,資訊包括名稱、位址、經緯度。
- 可設定地圖是否可單擊、拖動、滑鼠滾輪縮放。
- 可設定協定版本、秘鑰、主題樣式、中心坐标、中心城市、地理編碼位置等。
- 可設定地圖縮放比例和級别,縮略圖、比例尺、路況資訊等控件的可見。
- 支援地圖互動,比如滑鼠按下擷取對應位置的經緯度。
- 支援查詢路線,可設定起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
- 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
- 可設定行政區劃,指定某個城市區域繪制圖層,線上地圖自動輸出行政區劃邊界點集合到js檔案給離線地圖使用。
- 可靜态或者動态添加多個覆寫物。支援點、折線、多邊形、矩形、圓形、弧線、點聚合等。
- 函數接口友好和統一,使用簡單友善,就一個類。
- 支援js動态互動添加點、删除點、清空點、重置點,不需要重新整理頁面。
- 支援任意Qt版本、任意系統、任意編譯器。
三、體驗位址
- 國内站點: https://gitee.com/feiyangqingyun
- 國際站點: https://github.com/feiyangqingyun
- 個人首頁: https://blog.csdn.net/feiyangqingyun
- 知乎首頁: https://www.zhihu.com/people/feiyangqingyun/
四、效果圖
