[Qt]显示地图-2 将地图嵌入主窗口,可放大缩小

———————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

————————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();

// 更新坐标的接口
void updateCoordinates(double latA, double lonA, double latB, double lonB);

private slots:
void on_zoomInButton_clicked();

void on_zoomOutButton_clicked();

private:
Ui::MainWindow *ui;
private :
void zoomOut();
void zoomIn();
};

#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

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(37.7749, -122.4194)); // San Francisco
QVariant coordinateB = QVariant::fromValue(QGeoCoordinate(37.8044, -122.2711)); // 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);
}

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() { qDebug()<<"2"; 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();
}
}

———————————main.qml———————————-
#include “mainwindow.h”
#include “ui_mainwindow.h”
#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(37.7749, -122.4194)); // San Francisco
QVariant coordinateB = QVariant::fromValue(QGeoCoordinate(37.8044, -122.2711)); // 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);
}

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() { qDebug()<<"2"; 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();
}
}

发表评论

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