—————–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 += \
CoordinateUpdater.cpp \
main.cpp \
mainwindow.cpp
HEADERS += \
CoordinateUpdater.h \
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 += \
main.qml
RESOURCES += \
res.qrc
————-CoordinateUpdater.h—————————-
#ifndef COORDINATEUPDATER_H
#define COORDINATEUPDATER_H
#include
#include
class CoordinateUpdater : public QObject {
Q_OBJECT
Q_PROPERTY(QGeoCoordinate coordinateA READ coordinateA WRITE setCoordinateA NOTIFY coordinateAChanged)
Q_PROPERTY(QGeoCoordinate coordinateB READ coordinateB WRITE setCoordinateB NOTIFY coordinateBChanged)
public:
explicit CoordinateUpdater(QObject *parent = nullptr);
QGeoCoordinate coordinateA() const;
QGeoCoordinate coordinateB() const;
void setCoordinateA(const QGeoCoordinate &coord);
void setCoordinateB(const QGeoCoordinate &coord);
signals:
void coordinateAChanged();
void coordinateBChanged();
private:
QGeoCoordinate m_coordinateA;
QGeoCoordinate m_coordinateB;
};
#endif // COORDINATEUPDATER_H
———————————-mainwindow.h—————————–
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
————————————CoordinateUpdater.cpp—————————-
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
——————————————main.cpp————————————–
#include
#include
#include
#include
#include
#include
#include “CoordinateUpdater.h”
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
// 创建 C++ 坐标更新器
CoordinateUpdater coordinateUpdater;
coordinateUpdater.setCoordinateA(QGeoCoordinate(37.7749, -122.4194)); // 初始值 (旧金山)
coordinateUpdater.setCoordinateB(QGeoCoordinate(37.8044, -122.2711)); // 初始值 (奥克兰)
QQmlApplicationEngine engine;
// 将 C++ 对象暴露给 QML
engine.rootContext()->setContextProperty(“coordinateUpdater”, &coordinateUpdater);
// 加载 QML 文件
const QUrl url(QStringLiteral(“qrc:/main.qml”));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app,
[url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
},
Qt::QueuedConnection);
engine.load(url);
// 模拟外部更新坐标
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [&coordinateUpdater]() {
double newLatA = (qrand() % 180) – 90.0; // 随机纬度
double newLonA = (qrand() % 360) – 180.0; // 随机经度
double newLatB = (qrand() % 180) – 90.0;
double newLonB = (qrand() % 360) – 180.0;
coordinateUpdater.setCoordinateA(QGeoCoordinate(newLatA, newLonA));
coordinateUpdater.setCoordinateB(QGeoCoordinate(newLatB, newLonB));
});
timer.start(2000); // 每 2 秒更新坐标
return app.exec();
}
//#include “main.moc”
—————————–mainwindow.cpp———————————–
#include “mainwindow.h”
#include “ui_mainwindow.h”
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
——————————–main.qml————————————
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtLocation 5.15
import QtPositioning 5.15
ApplicationWindow {
visible: true
width: 640
height: 480
// QML 中的动态坐标绑定到 C++ 的属性
property var coordinateA: coordinateUpdater.coordinateA
property var coordinateB: coordinateUpdater.coordinateB
// 定义地图
Map {
anchors.fill: parent
plugin: Plugin {
name: “osm” // 使用 OpenStreetMap 插件
}
center: coordinateA // 设置地图中心为 A 坐标
zoomLevel: 12
// 绘制指向 B 坐标的箭头
MapQuickItem {
coordinate: coordinateA // A 坐标点
sourceItem: Image {
width: 30
height: 30
source: “qrc:/monkey.png” // 替换为您的箭头图片
rotation: Math.atan2(coordinateB.latitude – coordinateA.latitude,
coordinateB.longitude – coordinateA.longitude) * 180 / Math.PI
}
}
MapQuickItem {
coordinate: coordinateA // A 坐标点
sourceItem: Image {
width: 30
height: 30
source: “qrc:/monkey.png” // 替换为您的箭头图片
rotation: Math.atan2(-coordinateB.latitude + coordinateA.latitude,
-coordinateB.longitude + coordinateA.longitude) * 180 / Math.PI
}
}
}
/*
// 坐标更新时打印调试信息
Connections {
target: coordinateUpdater
onCoordinateAChanged: console.log(“Updated A:”, coordinateUpdater.coordinateA)
onCoordinateBChanged: console.log(“Updated B:”, coordinateUpdater.coordinateB)
}
*/
}