国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度

這篇具有很好參考價(jià)值的文章主要介紹了QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

最近需要使用百度地圖,并返回某個(gè)點(diǎn)的經(jīng)緯度值。網(wǎng)上基本都是根據(jù)經(jīng)緯度定位,而沒有獲取經(jīng)緯度的。自己用QT簡單實(shí)現(xiàn)了下。

1、編譯環(huán)境搭建

這塊耗時(shí)最久。因?yàn)橹癚T默認(rèn)的MinGW 64bit無法編譯,需要安裝MSVC2017(注意:安裝Visual Studio 2017,最開始安裝2022也不行)。安裝過程,自行百度。

2、添加QWebEngineView組件

Qt5.5之后使用新的QWebEngineView代替了之前的QWebView,加載數(shù)據(jù)的方式也由同步變成了異步。所以訪問網(wǎng)站頁面和加載HTML頁面都需要使用QWebEngineView類。而在QT提供的控件中是找不到QWebEngineView組件的。
先選個(gè)Graphics view控件,命名為mappage,然后右鍵,找到“提升為”,在對(duì)話框中的“提升的類名稱”,輸入QWebEngineView,點(diǎn)擊添加即可。

在添加兩個(gè)按鈕進(jìn)行定位及獲取經(jīng)緯度,兩個(gè)lineEdit顯示經(jīng)緯度。簡單UI如下
QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度

3、添加QWebEngineView類

QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度

4、直接上代碼

mainwindow.h如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWebEngineHistory>
#include <QWebEngineHistoryItem>
#include <QWebEnginePage>
#include <QWebEngineView>
#include <QtWebEngineWidgets/QtWebEngineWidgets>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp中,通過QWebChannel創(chuàng)建一個(gè)與網(wǎng)頁交互的通道,通道ID 為 JSBaidumap。加載網(wǎng)頁,并進(jìn)行參數(shù)傳遞及獲取。
代碼如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QString htmlPath = QCoreApplication::applicationDirPath() + "/html/";
    QString htmlFile = htmlPath + "baidumap.html";
    qDebug() << htmlFile;
    QFile file(htmlFile);
    if(!file.exists())
        qDebug() << "html file is not exist";
    /* 創(chuàng)建一個(gè)與網(wǎng)頁交互的通道 */
    QWebChannel *webChannel = new QWebChannel(ui->mappage->page());
    ui->mappage->page()->setWebChannel(webChannel);
    /* 注冊通道,ID 為 JSBaidumap,其將在JS文件這引用 */
    webChannel->registerObject(QString("JSBaidumap"), ui->mappage);
    /* 加載網(wǎng)頁,注意加載網(wǎng)頁必須在通道注冊之后,其有有一個(gè)注冊完成的信號(hào),
       可根據(jù)需要調(diào)用 */
    ui->mappage->page()->load(QUrl("file:///" + htmlFile));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()			//加載定位點(diǎn)
{
    QString lon = ui->lineEdit->text();
    QString lat = ui->lineEdit_2->text();
    QString cmd=QString("setlocation(%1,%2)").arg(lon).arg(lat);		//將經(jīng)緯度傳給網(wǎng)頁端
    qDebug() << cmd;
    ui->mappage->page()->runJavaScript(cmd);
}


void MainWindow::on_pushButton_2_clicked()			//獲取經(jīng)緯度
{
    //QVariant station;
    QString cmd=QString("getlocation()");
    qDebug() << cmd;
    ui->mappage->page()->runJavaScript(cmd, [this](const QVariant &station)		//獲取經(jīng)緯度
    {
        qDebug() << "qt call js= " << station;
        double lng = station.toMap().toStdMap().at("lng").toDouble();		//解析經(jīng)緯度
        double lat = station.toMap().toStdMap().at("lat").toDouble();
        ui->lineEdit->setText(QString::number(lng,'g',6));
        ui->lineEdit_2->setText(QString::number(lat,'g',6));
    });

}

5、HTML文件

具體可參考百度地圖開發(fā)者中心的示例:https://lbsyun.baidu.com/jsdemo.htm#aCreateMap
我的HTML里實(shí)現(xiàn)了,地圖中,以城市名設(shè)置中心,單擊事件、獲取單擊點(diǎn)的經(jīng)緯度、按照給的經(jīng)緯度定位功能,baidumap.html如下:

<!DOCTYPE html> 
<html>
	<head> 
		<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
		<title>BDMap Sample</title> 
		<style type="text/css"> 
			html{height:100%} 
			body{height:100%;margin:0px;padding:0px} 
			#container{height:100%} 
		</style> 
		<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=你的密鑰"></script>
		<script type="text/javascript" src="qwebchannel.js"></script>   <!-- 與qt交互 -->
	</head> 

	<body> 
		<div id="container"></div>
		
		<script type="text/javascript">
			var map = new BMapGL.Map("container");           // 創(chuàng)建地圖實(shí)例 
			map.centerAndZoom('深圳市', 15);                    // 初始化地圖,設(shè)置中心點(diǎn)坐標(biāo)和地圖級(jí)別 
			
			
			// map.setMapType(BMAP_EARTH_MAP);                  // 設(shè)置地圖樣式,地球模式    
			// 創(chuàng)建標(biāo)點(diǎn)  
			//var point = new BMapGL.Point(113.952988, 22.539841);   
			//var marker = new BMapGL.Marker(point);        // 創(chuàng)建標(biāo)注   
			//map.addOverlay(marker);                     // 將標(biāo)注添加到地圖中 
			map.addEventListener('click', function (e) {
				map.clearOverlays();
				var cpoint=new BMapGL.Point(e.latlng.lng,e.latlng.lat);
				var cmarker = new BMapGL.Marker(cpoint);        // 創(chuàng)建標(biāo)注
				map.addOverlay(cmarker);
				map.setCenter(cpoint);
				//alert('點(diǎn)擊位置經(jīng)緯度:' + e.latlng.lng + ',' + e.latlng.lat);
			});
			
           /*****************************/
			// qt交互注冊
			new QWebChannel(qt.webChannelTransport,
				function(channel){
					window.JSBaidumap = channel.objects.JSBaidumap; // 注冊
				}
			);
			
			function setlocation(lng,lat){							//根據(jù)給定經(jīng)緯度加載定位點(diǎn)并創(chuàng)建標(biāo)注
				map.clearOverlays();
				var newpoint=new BMapGL.Point(lng,lat);
				var newmarker = new BMapGL.Marker(newpoint);        
				map.addOverlay(newmarker);
				map.setCenter(newpoint);
				//alert('設(shè)置位置經(jīng)緯度:' + lng + ',' + lat);
			};
			
			function getlocation(){									//獲取經(jīng)緯度
				var gpoint=map.getCenter();
				//alert('設(shè)置位置經(jīng)緯度:' + gpoint.lng + ',' + gpoint.lat);
				return gpoint;
			};
			
			map.enableScrollWheelZoom(true);                 // 設(shè)置滾輪縮放
          /******************************/
	</script> 
	</body> 
</html>

注意,代碼中使用的是相對(duì)地址,baidumap.html放在編譯文件夾下build-maptest-Desktop_Qt_5_14_2_MSVC2017_64bit-Release\release\html
同時(shí),在你的QT安裝路徑Qt5.14.2\Examples\Qt-5.14.2\webchannel\shared下拷貝qwebchannel.js文件到build-maptest-Desktop_Qt_5_14_2_MSVC2017_64bit-Release\release\html\文件下,此文件是QT程序與JS文件通訊用的。

6、運(yùn)行效果

QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度
直接運(yùn)行,加載百度地圖,以深圳市為中心。
QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度
設(shè)置經(jīng)緯度,加載定位點(diǎn),并跳到此經(jīng)緯度,地圖以此點(diǎn)為中心。
QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度
鼠標(biāo)在地圖上任意點(diǎn)下,地圖以此點(diǎn)為中心。點(diǎn)獲取經(jīng)緯度按鈕,可以獲取此位置經(jīng)緯度。文章來源地址http://www.zghlxwxcb.cn/news/detail-465178.html

到了這里,關(guān)于QT調(diào)用百度地圖并返回點(diǎn)擊地的經(jīng)緯度的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包