在 QML qt 中控制 OSM 映射

     2023-03-22     144

关键词:

【中文标题】在 QML qt 中控制 OSM 映射【英文标题】:Control OSM map in QML qt 【发布时间】:2021-11-07 01:58:12 【问题描述】:

我正在尝试在 Qt 中控制地图,但是我一直遇到以下错误:

QGeoTileRequestManager: Failed to fetch tile (291271,152514,19) 5 times, giving up. Last error message was: 'Permission denied'

我在 C++ 中有解析消息并计算位置的函数:

Map.qml

import QtQuick 2.12
import QtQuick.Window 2.14
import QtQuick.Controls 2.15
import QtLocation 5.6
import QtPositioning 5.6
import QtQuick.Controls.Material 2.12
import QtQuick.Layouts 1.12
import Qt.labs.location 1.0

Page 
    id: mainWindow
    visible: true

    function addMarker(latitude, longitude)
    
        var Component = Qt.createComponent("qrc:/Marker.qml")
        var item = Component.createObject(window, 
                                              coordinate: QtPositioning.coordinate(latitude, longitude)
                                          )
        map.addMapItem(item)
    

    Map 
        id: map
        width: mainWindow.width
        height: mainWindow.height
        plugin: mapPlugin
        center: QtPositioning.coordinate(59.91, 10.75)
        Component.onCompleted: addMarker(59.91, 10.75)
        zoomLevel: 60

    

    Plugin 
        id: mapPlugin
        name: "osm" // "mapboxgl", "esri", ...
        // specify plugin parameters if necessary
        PluginParameter 
            name: "osm.mapping.providersrepository.disabled"
            value: "true"
        
        PluginParameter 
            name: "osm.mapping.providersrepository.address"
            value: "http://maps-redirect.qt.io/osm/5.6/"
        
    

通过Q_PROPERTY设置坐标:

#include <QObject>

class Data : public QObject

    Q_OBJECT;
    Q_PROPERTY(double gnss_log READ gnss_long WRITE set_gnss_long NOTIFY gnss_long_changed);
    Q_PROPERTY(double gnss_lat READ gnss_lat WRITE set_gnss_lat NOTIFY gnss_lat_changed);
public: signals:

    void gnss_long_changed();
    void gnss_lat_changed();

public slots:

    void set_gnss_long(double);
    void set_gnss_lat(double);

public:
    Data();

    double gnss_long();
    double gnss_lat();

private:
    double m_gnss_long;
    double m_gnss_lat;
;


void Data::set_gnss_long(double curr_long)

    // Checks whether updated baud rate changed
    if (curr_long == m_gnss_long)
        return;

    m_gnss_long = curr_long;
    qDebug() << m_gnss_long;
    //Emits signal indicating change
    emit gnss_long_changed();


double Data::gnss_long()

    return m_gnss_long;

当我运行它时,我得到一个空白屏幕,上面提到了一堆错误。

【问题讨论】:

请提供minimal reproducible example。纬度和经度的值是多少 我添加了一个可重现的例子,坐标在设定的时间间隔内变化 但是到什么值(或它改变的值范围)?您使用的 Qt 版本是什么? Qt 5.15,我需要它们从 -180 到 180。 纬度必须在-90到90之间,经度在-180到180之间,你满足了吗? 【参考方案1】:

由于 OP 没有提供 MRE,我的答案只会显示一个演示。逻辑是创建一个暴露位置的QProperty,然后必须做一个绑定:

#include <QGeoCoordinate>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QTimer>

#include <random>

class Data: public QObject
    Q_OBJECT
    Q_PROPERTY(QGeoCoordinate gnssPosition READ gnssPosition WRITE setGnssPosition NOTIFY gnssPositionChanged)
public:
    const QGeoCoordinate &gnssPosition() const
        return m_gnssPosition;
    
    void setGnssLatitude(qreal latitude)
        QGeoCoordinate coordinate(latitude, m_gnssPosition.longitude());
        setGnssPosition(coordinate);
    
    void setGnssLongitude(qreal longitude)
        QGeoCoordinate coordinate(m_gnssPosition.latitude(), longitude);
        setGnssPosition(coordinate);
    
    void setGnssPosition(const QGeoCoordinate &newGnssPosition)
        if (m_gnssPosition == newGnssPosition)
            return;
        m_gnssPosition = newGnssPosition;
        emit gnssPositionChanged();
    
signals:
    void gnssPositionChanged();
private:
    QGeoCoordinate m_gnssPosition;
;

int main(int argc, char *argv[])

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    Data data_out;
    data_out.setGnssPosition(QGeoCoordinate(59.91273, 10.74609));

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("data_out", &data_out);
    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;
    timer.setInterval(1000);
    QObject::connect(&timer, &QTimer::timeout, &data_out, [&data_out]()
        std::random_device rd;
        std::mt19937 e2(rd());
        std::uniform_real_distribution<> dist(-.05, .05);

        QGeoCoordinate coord = data_out.gnssPosition();
        coord.setLatitude(coord.latitude() + dist(e2));
        coord.setLongitude(coord.longitude() + dist(e2));
        data_out.setGnssPosition(coord);
        // qDebug() << data_out.gnssPosition();
    );
    timer.start();

    return app.exec();


#include "main.moc"
import QtQuick 2.15
import QtQuick.Window 2.15
import QtLocation 5.15
import QtPositioning 5.15

Window 
    id: mainWindow
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    property Component markerProvider: MapQuickItem 
        anchorPoint.x: rect.width / 2
        anchorPoint.y: rect.height / 2
        sourceItem: Rectangle
            id: rect
            width: 40
            height: 40
            color: "salmon"
        
    

    function addMarker(coordinate)
        var marker = markerProvider.createObject()
        console.log(marker)
        marker.coordinate = coordinate
        map.addMapItem(marker)
    

    Map 
        id: map
        width: mainWindow.width
        height: mainWindow.height
        plugin: mapPlugin
        center: data_out.gnssPosition
        zoomLevel: 12

    

    Plugin 
        id: mapPlugin
        name: "osm" // "mapboxgl", "esri", ...
        // specify plugin parameters if necessary
        PluginParameter 
            name: "osm.mapping.providersrepository.disabled"
            value: "true"
        
        PluginParameter 
            name: "osm.mapping.providersrepository.address"
            value: "http://maps-redirect.qt.io/osm/5.6/"
        
    
    Connections
        target: data_out
        function onGnssPositionChanged()
            addMarker(data_out.gnssPosition)
        
    


【讨论】:

有没有办法通过来自gnssPositionChanged的信号而不是定时来触发坐标的变化? 所以如果我要创建一个QObject::connect(&amp;data_out, &amp;Data::gnssPositionChanged, &amp;data_out, [&amp;data_out]()QGeoCoordinate coord = data_out.gnssPosition(); data_out.setGnssPosition(coord); ); 并通过设置器在内部设置纬度和经度,那应该可以吗? 我确实了解代码的作用,但我正在尝试找到一种方法将其与我当前的代码合并。我有一个在另一个类中设置经度和纬度的解析器,我已经用data_out.setGnssLongitude(Parser::get_gnss_longitude(data));data_out.setGnssLatitude(Parser::get_gnss_latitude(data)); 替换了我拥有的函数。这意味着每次更新该位置时都会发出信号gnssPositionChanged。但是,位置不会随着信号的发射而改变,因此我要征求您对是否需要连接的意见。 让我们continue this discussion in chat。 我明白,但我使用的代码库非常庞大,我根本无法将其最小化。

QML/OSM。如何显示圆圈?

...2018-06-1712:35:04【问题描述】:我有一张地图,我需要显示在她的圈子上。在从C++/Qt代码执行程序期间,这个圆圈的位置也会发生变化。我怎样才能做到这一点?ma​​p.qmlimportQtQuick2.9importQtLocation5.6importQtPositioning5.6RectanglePl 查看详情

QT QML QtLocation 地图插件

】QTQMLQtLocation地图插件【英文标题】:QTQMLQtLocationmapplugin【发布时间】:2017-07-1303:59:01【问题描述】:我有自己的本地Z/X/Y地图切片服务器,并希望将其用作QML应用程序中的地图背景。查看示例代码,这似乎是由以下人员完成的... 查看详情

如何在 QML 中设置正确的路径到离线 OSM 目录(不使用 qrc)?

】如何在QML中设置正确的路径到离线OSM目录(不使用qrc)?【英文标题】:HowtosetproperpathtoofflineOSMdirectoryinQML(notusingqrc)?【发布时间】:2021-08-2920:30:22【问题描述】:我想在带有.exe的文件夹中拥有带有磁贴realTiles的文件夹。我当... 查看详情

如何在 qml 文件 Qt Android 中使用 setMuted()

...creator创建了一个新的Qt快速应用程序,我播放音频,我想控制音量和静音,但不知道如何。Buttonid:muteButtonon 查看详情

在 QML 中使用离线交互式地图

...的内容,OpenStreetMapPlugin似乎没有任何参数将源文件作为映射。它仅适用于服务器。问题是我在运行我的应用程序时没有Internet连接。我需要在内部使用地图。Ma 查看详情

QML 映射 - TLS 初始化失败 ERROR

】QML映射-TLS初始化失败ERROR【英文标题】:QMLmap-TLSinitializationfailedERROR【发布时间】:2021-03-2017:03:54【问题描述】:我目前正在创建一个能够显示地图的应用程序。在添加更多高级功能之前,我想简单地在应用程序中显示某个区... 查看详情

Qt/QML:如何在 QML 中双向同步 ScrollView?

】Qt/QML:如何在QML中双向同步ScrollView?【英文标题】:Qt/QML:HowtobidirectionalsyncScrollViewinQML?【发布时间】:2020-03-0811:42:44【问题描述】:我想同步两个可滚动列表视图的contentY,如此简化代码所示ItemSplitVieworientation:Qt.HorizontalCompone... 查看详情

PySide 如何在 python 控制台中查看 QML 错误?

】PySide如何在python控制台中查看QML错误?【英文标题】:PySideHowtoseeQMLerrorsinpythonconsole?【发布时间】:2018-12-3120:49:16【问题描述】:我有以下代码:if__name__==\'__main__\':os.environ["QT_QUICK_CONTROLS_STYLE"]="Material"app=QGuiApplication(sys.argv)eng... 查看详情

在 QML/Qt 中模糊部分背景图像

】在QML/Qt中模糊部分背景图像【英文标题】:BlurpartofbackgroundimageinQML/Qt【发布时间】:2020-04-0822:31:05【问题描述】:我对QML/Qt还很陌生。基本上我想知道如何对下面照片上看到的白色矩形的inside应用模糊处理,并且只对内部应用... 查看详情

Qt5。在 QML 中嵌入 QWidget 对象

】Qt5。在QML中嵌入QWidget对象【英文标题】:Qt5.EmbedQWidgetobjectinQML【发布时间】:2012-10-2215:14:17【问题描述】:我正在使用Qt5beta并尝试将基于QWidget的对象嵌入到QML中。目标是尽可能多地使用QML,并且只在QML不能满足我需要的地方... 查看详情

Qt/QML - 在 C++ 中注册 QML 类型会使 QML 代码不起作用

】Qt/QML-在C++中注册QML类型会使QML代码不起作用【英文标题】:Qt/QML-RegisteringaQMLtypeinC++makesQMLcodenotwork【发布时间】:2014-04-1909:47:09【问题描述】:我正在做一些事情,我有一个名为“FloatingMenu”的类(它应该在C++中管理一个菜单... 查看详情

在 Qt/QML 中访问/修改一个类型的所有实例

】在Qt/QML中访问/修改一个类型的所有实例【英文标题】:Accessing/modifyingallinstancesofatypeinQt/QML【发布时间】:2015-02-2714:30:38【问题描述】:在QML中,我有一个自定义对象类型(一个单独的QML文件),我想要一种访问和/或修改此类... 查看详情

Qt QML - 在 QML 中识别超出鼠标区域范围

】QtQML-在QML中识别超出鼠标区域范围【英文标题】:QtQML-RecognizeoutofmouseareascopeinQML【发布时间】:2015-12-0711:54:16【问题描述】:我创建了一个qtquick2.4文件,在该文件中我使用了TextInput和ListView。我想要的是当用户在TextInput中写一... 查看详情

QML Connections 在 Qt6 中无法正常运行

】QMLConnections在Qt6中无法正常运行【英文标题】:QMLConnectionscannotrunnormallyinQt6【发布时间】:2021-08-2700:28:22【问题描述】:QML连接问题qrc:/main.qml:12:5:QMLConnections:Detectedfunction"onTop"inConnectionselement.Thisisprobablyintendedtobeasignalh 查看详情

在 QML (Qt) 中读写文件

】在QML(Qt)中读写文件【英文标题】:ReadingandwritingfilesinQML(Qt)【发布时间】:2013-07-2613:25:07【问题描述】:我正在尝试实现ReadingandwritingfilesinQML,并遇到了来自诺基亚的链接文章,但未能成功使用看似明显的代码示例。我想我不... 查看详情

QT/QML 数据模型

...描述】:我想创建一个具有如下结构的Qt数据模型,以便在Python和QML中使用。如果在Python或QML中更改、添加或删除任何值或键,我需要在另一端(QML或Python)更新这些值。理想情况下,这将是ListView中使用的模型,我只会显示ListV... 查看详情

如何评价qml?

...CSS(参考后文具体例子),但又支持javascript形式的编程控制。我个人认为它结合了QtDesignerUI和QtScript的优点。QtDesigner可以设计出·ui界面文件,但是不支持和Qt原生C++代码的交互。QtScript可以和Qt原生代码进行交互,但是有一个缺... 查看详情

当变量在 QML 中更改其值时,如何在 Qt 中执行函数?

】当变量在QML中更改其值时,如何在Qt中执行函数?【英文标题】:HowtoexecuteafunctioninQtwhenavariablechangesitsvalueintheQML?【发布时间】:2015-02-0409:12:07【问题描述】:error:nomatchingfunctionforcallto\'SimulationMode::connect(QString&,constchar*,Simula... 查看详情