目录一、前言二、功能特点1 省市区域地图封装类功能特点2 百度地图封装类功能特点3 离线地图下载类功能特点4 省市轮廓下载类功能特点三、体验地址四、效果图五、相关代码一、前言 跨平台
跨平台着实花了不少的精力,为了从Qt4.7兼容到Qt6.2及后续版本,头发掉了不少,仅有的几根毛所剩无几,哎,可能这就是程序员的命,本人写Qt程序这么多年,比较喜欢支持多个Qt版本,尤其是钟情于支持任意Qt版本+任意系统+任意编译器,这句话说起来简单其实实现起来就不容易了,首先你得有个很多版本的测试环境,起码十几个Qt环境要的吧,四五种操作系统要的吧,还要安装各种VS版本免不了的,毕竟win上除了默认的mingw编译器还有很多人用的是msvc编译器,这么一大堆环境折腾下来,没有个1T硬盘是不够的,而且官网发布Qt版本的速度相当快,最慢半年肯定来一个版本,又得测试了,每次发布一个大的版本,除了常用的windows以外,linux要测试吧,而且现在还多出来一些国产linux系统比如deepin new start UOS之类的,也要试试吧,哎呀好累。
体验地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg 提取码:uyes 文件名:bin_map.zip
国内站点:Https://gitee.com/feiyangqingyun
国际站点:https://GitHub.com/feiyangqingyun
#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();
//初始化通用地图数据
WebHelper::initMapData();
//数据交互类
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);
//设置对应的通信通道
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
//关联加载完成信号
#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
//设置没有右键菜单
#if (defined webkit) || (defined webengine) || (defined webie) || (defined webminiblink)
webView->setContextMenuPolicy(Qt::NoContextMenu);
#endif
//安装事件过滤器
#ifdef webminiblink
webView->installEventFilter(this);
#endif
}
void WebView::initWebSetting()
{
//全局配置只需要设置一次就行
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)
{
//测试发现miniblink内核(其他内核正常),网页中的右键有消息会传给父类
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)
{
//如果存在网址则优先直接加载网址
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编写地图之实现跨平台功能的详细内容,更多关于Qt地图 跨平台的资料请关注编程网其它相关文章!
--结束END--
本文标题: Qt编写地图之实现跨平台功能
本文链接: https://lsjlt.com/news/139241.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0