当底层模型更改时,QT QmlMap PolyLine 未正确更新

2024-01-08

我正在尝试将多个地理坐标与地图中的折线连接起来。坐标存储在模型 (QAbstractListModel) 类中,我可以在其中修改(删除和添加)C++ 中的坐标。

简单地显示每个坐标的标记就可以了,但是当我将它们与折线连接并从模型中删除一些现有坐标时,折线不会更新。

map.qml

import QtQuick 2.0
import QtLocation 5.6
import QtPositioning 5.6

Item {
    width: 512
    height: 512
    visible: true

    id: mainWindow

    Map { //our map
        anchors.fill: parent
        id: map
        plugin: mapPlugin
        zoomLevel: 14
        focus: true

        Plugin {
            id: mapPlugin
            name: "osm"
        }

        MapItemView {
            model: markerModel
            delegate: mapcomponent
        }

        MapItemView {
            model: markerModel
            delegate: MapPolyline {
                antialiasing: true
                line.color: "darkBlue"
                line.width: 3
                path: pathRole
            }
        }

        Component {
            id: mapcomponent
            MapQuickItem{
                id: marker
                coordinate: positionRole
                sourceItem: Image{
                    id: markerimage
                    width: 20
                    height: 30
                    source: "qrc:/marker.png"
                }
                anchorPoint.x: markerimage.width / 2
                anchorPoint.y: markerimage.height
            }
        }

        MouseArea {
            anchors.fill: parent

            onClicked: {
                var coord = parent.toCoordinate(Qt.point(mouse.x,mouse.y))
                markerModel.addMarker(coord)
            }
        }
    }
}

标记模型.h它存储坐标

class MarkerModel : public QAbstractListModel {
    Q_OBJECT
public:
    using QAbstractListModel::QAbstractListModel;
    enum MarkerRoles{positionRole = Qt::UserRole, pathRole};

    Q_INVOKABLE void addMarker(const QGeoCoordinate &coordinate) {
        beginInsertRows(QModelIndex(), rowCount(), rowCount());
        m_coordinates.append(coordinate);
        endInsertRows();
    }

    int rowCount(const QModelIndex &parent = QModelIndex()) const override {
        Q_UNUSED(parent)
        return m_coordinates.count();
    }

    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override {
        if(row + count > m_coordinates.count() || row < 0)
            return false;

        beginRemoveRows(parent, row, row+count-1);
        for(int i = 0; i < count; ++i)
            m_coordinates.removeAt(row + i);
        endRemoveRows();

        return true;
    }

    bool removeRow(int row, const QModelIndex &parent = QModelIndex()) {
        return removeRows(row, 1, parent);
    }

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override {
        if (index.row() < 0 || index.row() >= m_coordinates.count())
            return QVariant();
        if(role == Qt::DisplayRole)
            return QVariant::fromValue(index.row());
        if(role == MarkerModel::positionRole)
            return QVariant::fromValue(m_coordinates[index.row()]);        
        if(role == MarkerModel::pathRole) {
            QVariantList coordlist;
            for(auto &geocoord : m_coordinates)
                coordlist << QVariant::fromValue(geocoord);

            return coordlist;
        }

        return QVariant();
    }

    QHash<int, QByteArray> roleNames() const {
        QHash<int, QByteArray> roles;
        roles[positionRole] = "positionRole";
        roles[pathRole] = "pathRole";
        return roles;
    }

private:
    QList<QGeoCoordinate> m_coordinates;
};

显示我的问题的 gif:

在删除模型中的行时我是否遗漏了某些内容?有没有办法强制 qml 使用模型中的全新数据渲染折线?


有一个pathRole这里没有多大意义。对于模型的所有行,此角色都是相同的。 你显示nMapPolyline其中 n 是坐标数,整个模型只需要一个。

我建议你删除pathRole并暴露一个path模型中的属性,并发出通知信号addMarker and removeRows.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当底层模型更改时,QT QmlMap PolyLine 未正确更新 的相关文章

随机推荐

  • 如何以编程方式关闭 UITextView 中的自动更正弹出窗口?

    我正在自己做一些自定义自动完成的事情insertText 但是如果有可见的自动更正建议 视图就会进入奇怪的状态 如果我使用 textView unmarkText 它会忽略自动更正弹出窗口 但它接受自动更正 这很糟糕 有什么方法可以以编程方
  • 最佳 JDBC 数据源 bean 类

    我看到有些人使用org apache commons dbcp BasicDataSource而其他配置有com mchange v2 c3p0 ComboPooledDataSource Spring有它自己的 org springfra
  • 使用字典中的值替换列中的值

    import pandas as pd df pd DataFrame Data Hey this is 123456 Jonny B Good This is Jonny B Good at 511 233 1137 Wow that i
  • Google Play 服务已过时。需要 7571000 但找到 6774470

    我正在尝试将 google play API 添加到我的 Android 游戏中 并且按照他们网站上的说明进行操作 我在模拟器运行时遇到这个错误 试图解决它 在我的手机上 应用程序崩溃了 在清单中
  • 为什么我的异步函数返回空数组?

    我试图通过将用户的匹配项推入一个数组并返回该数组来获取用户的匹配项 以便我的路由器可以将数据发送到前端 但我的异步函数有一个问题 我只有一个空数组 我尝试设置一些断点 我注意到我的路由器在我的服务将数据推送到数组之前发送数据 这是我的路由器
  • Django 1.4 在开发服务器上提供 MEDIA_URL 和 STATIC_URL 文件

    刚刚升级到 Django 1 4 并且在开发服务器上新的 改进 的静态和媒体文件服务方面遇到了严重问题 我喜欢 Django 但到底为什么他们用 STATIC URL STATIC ROOT STATICFILES DIR 使这些文件的服务
  • 使用命令行从谷歌下载图像[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想用命令行下载谷歌给我的第n张图像 即像使用命令一样wget 搜索图像 something 我只是去页面https www google
  • const 中 u32::BITS 的替代方案是什么?

    我有一些代码可以做到这一点 const MY CRAZY CONSTANT u32 1 lt lt u32 BITS 1 我尝试使用 Rust nightly 2016 03 29 编译它 但失败并显示以下消息 error no assoc
  • 批处理文件和 DEL errorlevel 0 问题

    该批处理必须从特定位置删除文件和目录 并将成功或 stdout stderr 消息输出到新的 txt 文件 我已经创建了脚本的大部分内容 并且它的执行完全符合预期 除非删除成功 否则它会前进到下一行 而不是在日志上回显 成功 消息 echo
  • java 8流用于根据特定字段对对象列表进行排序

    我有一个根据时间戳对对象进行排序的场景 课程如下 class Employee private String name private List
  • 具有不同参数的重载方法的方法引用无效

    当尝试编译表达式时Comparator comparing String toLowerCase Java 编译器返回错误 请参阅以下问题以获取更多信息 为什么 Comparator comparing 不适用于 String toLowe
  • 无法解析基于模板的标识符“get”。网豆8.1

    我的问题是 我收到了帖子主题中出现的警告 真是令人沮丧 这自动完成不适用于该代码 除此之外还会出现警告 标准设定为C 14 例如 Boxes 2 get gt setPosition Boxes 2 get gt getPosition v
  • 正则表达式仅使用egrep捕获整个单词

    我正在使用egrep 来查看perforce NAS 中的脚本 我试图找到我们使用 RCP 和 RSH 的地方 我遇到的问题是 1 我在 REGEX 上很糟糕 2 我正在捡起我不感兴趣的垃圾 例如 如果一个文件包含单词 strcpy 它会捡
  • 错误1001。初始化安装时发生异常

    我在尝试卸载时看到以下错误 程序文件中没有WRT文件夹 如何卸载该软件 注意 我已从程序文件中删除了软件文件夹 错误信息 System IO FileNotFoundException could not load file or asse
  • 如何检查 Java 8 Streams 中是否存在重复项?

    在 java 8 中 检查列表是否包含重复项的最佳方法是什么 我的想法是这样的 list size list stream distinct count 这是最好的方法吗 您的代码需要迭代所有元素 如果你想确保没有重复的简单方法 例如 pu
  • 如何为 HTML div 标签设置边框

    我正在尝试在 HTML 中定义 div 标签周围的边框 在某些浏览器中 边框不会出现 这是我的 HTML 代码 div style border thin div
  • 计算嵌套对象中的键数

    我正在尝试统计嵌套 JS 对象中的键 我能够到达第一层 但我有点困惑如何让它深入嵌套对象并返回计数 var properties prop1 prop2 prop3 prop4 subProp1 subProp2 subProp3 subS
  • 设置 eclipse java SE-1.7

    我想开始学习java 但是Eclipse给我带来了一些麻烦 首先 我是一个Java初学者 对它知之甚少甚至一无所知 我想使用 JavaSe 1 7 除了使用最新版本之外 我没有明确的理由使用它 下载 Eclipse 适用于 Java 开发人
  • 为什么非成员 static constexpr 变量不是隐式内联的?

    在 C 17 中 我们得到了内联变量 并且我假设全局 constexpr 变量是隐式内联的 但显然这只适用于静态member变量 这背后的逻辑 技术限制是什么 source 声明为 constexpr 的静态成员变量 但不是名称空间范围变量
  • 当底层模型更改时,QT QmlMap PolyLine 未正确更新

    我正在尝试将多个地理坐标与地图中的折线连接起来 坐标存储在模型 QAbstractListModel 类中 我可以在其中修改 删除和添加 C 中的坐标 简单地显示每个坐标的标记就可以了 但是当我将它们与折线连接并从模型中删除一些现有坐标时