[Qt]地图显示4-显示指向

———————pro——————————
QT += core gui location positioning
QT += quick widgets quickwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp \
mainwindow.cpp

HEADERS += \
mainwindow.h

FORMS += \
mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
map.qml

RESOURCES += \
src.qrc \
src.qrc

—————mainwindow.h—————————

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:

bool isQmlView =false;

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

// 更新坐标的接口
void updateCoordinates(double latA, double lonA, double latB, double lonB);
private slots:
void on_zoomInButton_clicked();
void on_zoomOutButton_clicked();
void on_p2m_clicked();
void on_drawButton_clicked();

private:
Ui::MainWindow *ui;

QPointF center; // 圆心
double radius; // 圆半径
QPointF point1; // 经纬度点1对应的坐标
QPointF point2; // 经纬度点2对应的坐标
QPointF pointB; // 点 B 的圆周坐标
bool shouldDraw; // 是否绘制标志

void calculatePoints(double lat1, double lon1, double lat2, double lon2);
void calculatePointB(double latA, double lonA, double latB, double lonB);

private :
void zoomOut();
void zoomIn();

protected:
void paintEvent(QPaintEvent *event) override;

};

#endif // MAINWINDOW_H

—————–main.cpp————————–

#include “mainwindow.h”
#include
#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

// 更新坐标到新位置
// w.updateCoordinates(34.0522, -118.2437, 36.7783, -119.4179); // A: Los Angeles, B: Fresno

qDebug()<<"11"; return a.exec(); } ----------------mainwindow.cpp----------------------------- #include "mainwindow.h" #include "ui_mainwindow.h" #include
#include
#include
#include
#include
#include
#include

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

// 获取 QQuickWidget
QQuickWidget *quickWidget = ui->quickWidget;

// 设置 QML 文件路径
quickWidget->setSource(QUrl(QStringLiteral(“qrc:/map.qml”)));
quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);

// 获取 QML 上下文
QQmlContext *context = quickWidget->rootContext();

// 默认坐标
QVariant coordinateA = QVariant::fromValue(QGeoCoordinate(36.01, 37.32)); // San Francisco
QVariant coordinateB = QVariant::fromValue(QGeoCoordinate(36.50, 40.0)); // Oakland

// 传递默认坐标到 QML
context->setContextProperty(“coordinateA”, coordinateA);
context->setContextProperty(“coordinateB”, coordinateB);

// 连接按钮到槽函数
connect(ui->zoomInButton, &QPushButton::clicked, this, &MainWindow::on_zoomInButton_clicked);
connect(ui->zoomOutButton, &QPushButton::clicked, this, &MainWindow::on_zoomOutButton_clicked);

center = QPointF(600, 540);
radius = 50;

}

void MainWindow::updateCoordinates(double latA, double lonA, double latB, double lonB)
{
QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject(); // 修改为 QQuickItem*

if (rootObject) {
// 更新 QML 的属性
rootObject->setProperty(“coordinateA”, QVariant::fromValue(QGeoCoordinate(latA, lonA)));
rootObject->setProperty(“coordinateB”, QVariant::fromValue(QGeoCoordinate(latB, lonB)));
} else {
qWarning() << "Root object is null!"; } } // 放大地图 void MainWindow::zoomIn() { } // 缩小地图 void MainWindow::zoomOut() { } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_zoomInButton_clicked() { QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom + 1.0; // 增加 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
}
}

void MainWindow::on_zoomOutButton_clicked()
{

QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom – 1.0; // 减少 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
qDebug()<update();
}
}

void MainWindow::on_p2m_clicked()
{
isQmlView = !isQmlView;

if (isQmlView) {
ui->quickWidget->show();
ui->label->hide();
} else {
ui->quickWidget->hide();
ui->label->show();
//imageWidget->repaint();
}
}

void MainWindow::paintEvent(QPaintEvent *event) {
QMainWindow::paintEvent(event);

if (!shouldDraw) return; // 如果没有触发绘制,直接返回

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);

// 绘制圆
painter.setPen(Qt::black);
painter.drawEllipse(center, radius, radius);

// 绘制从圆心到点 B 的直线
painter.setPen(Qt::red); // 红色直线表示方向角
painter.drawLine(center, pointB);

qDebug() << "Drawn line from center to" << pointB; } void MainWindow::calculatePointB(double latA, double lonA, double latB, double lonB) { // 经纬度转弧度 double phi1 = qDegreesToRadians(latA); // 点 A 的纬度 double phi2 = qDegreesToRadians(latB); // 点 B 的纬度 double deltaLambda = qDegreesToRadians(lonB - lonA); // 经度差 // 计算方位角 (以弧度为单位) double theta = qAtan2( qSin(deltaLambda) * qCos(phi2), qCos(phi1) * qSin(phi2) - qSin(phi1) * qCos(phi2) * qCos(deltaLambda) ); // 转换为 [0, 2π] 范围 if (theta < 0) theta += 2 * M_PI; qDebug() << "Calculated angle (radians):" << theta; // 计算点 B 的圆周坐标 pointB.setX(center.x() + radius * qCos(theta)); pointB.setY(center.y() - radius * qSin(theta)); qDebug() << "Point B (on circle):" << pointB; } void MainWindow::on_drawButton_clicked() { // 示例经纬度 double latA = 30.0, lonA = 120.0; // 点 A 经纬度 double latB = 35.0, lonB = 125.0; // 点 B 经纬度 calculatePointB(latA, lonA, latB, lonB); shouldDraw = true; update(); // 触发重绘 } -----------------------------map.qml------------------------------- import QtQuick 2.15 import QtQuick.Controls 2.15 import QtLocation 5.15 import QtPositioning 5.15 Item { width: 800 height: 600 Plugin { id: mapPlugin name: "osm" // 使用 OpenStreetMap 插件 } // 坐标属性,可通过 C++ 更新 property var coordinateA: QtPositioning.coordinate(36.01, 116.11) property var coordinateB: QtPositioning.coordinate(37.0, 117.0) property real zoomLevelVal: 10 Map { anchors.fill: parent plugin: mapPlugin center: coordinateA // 默认以 A 为中心 zoomLevel: zoomLevelVal // 使用绑定的 zoomLevel 属性 // 显示从 A 到 B 的路径 MapPolyline { line.width: 1 line.color: "red" path: [coordinateA, coordinateB] } } }

发表评论

邮箱地址不会被公开。 必填项已用*标注