Добавлены строки AbstractListModel, но представление QML не обновляется

У меня есть модель, у которой есть список MarkerItem (который является структурой).

struct MarkerItem{
    enum marker_state{
        marker_observation = 0,
        marker_important,
        marker_redundant,
        marker_deleted
    };
    MarkerItem(const QPointF& pos, marker_state state, const QDateTime& when, const QString& label);

    const QPointF& position() const;
    QGeoCoordinate coordinate() const;
    const QString& label() const;
    marker_state state() const;

    void change_state(marker_state state);

  private:
    QPointF      _position;
    marker_state _state;
    QString      _label;
    QDateTime    _when;
};
class MarkerModel : public QAbstractListModel{
  Q_OBJECT
  Q_PROPERTY(QGeoRoute* route READ route NOTIFY routeChanged)
  public:
    enum MarkerRoles {
        PositionRole = Qt::UserRole + 1,
        StateRole,
        LabelRole
    };
    explicit MarkerModel(QObject *parent = 0);
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
  public:
    QHash<int, QByteArray> roleNames() const;
  private:
    QList<MarkerItem*> _markers;
  public:
    void addMarker(MarkerItem* marker);
  public:
    QGeoRoute* route() const;
  signals:
    void routeChanged();
};

void MarkerModel::addMarker(MarkerItem *marker){
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    _markers.push_back(marker);
    qWarning() << rowCount();
    endInsertRows();
}

В моем QML у меня есть

Map {
    id: map
    anchors.fill: parent
    plugin: mapPlugin
    center: QtPositioning.coordinate(22.5726, 88.3639)
    zoomLevel: 14

    MapItemView {
        model: markerModel
        delegate: markerDelegate
    }

    Component {
        id: markerDelegate

        MapQuickItem{
            anchorPoint: Qt.point(2.5, 2.5)
            coordinate: QtPositioning.coordinate(position.x, position.y)
            zoomLevel: 0
            sourceItem: Rectangle{
                width:  settings.marker_size;
                height: settings.marker_size;
                radius: settings.marker_size/2;
                color:  settings.marker_colors[status]
                border.color: "white"
                border.width: 1
            }
        }
    }
    Component{
        id: polyline

        MapPolyline {
            line.color: black
            line.width: 2
            path: []
        }
    }
}

Я передаю эту модель в представление QML

_model->addMarker(new MarkerItem(QPointF(22.5868f, 88.4149f), MarkerItem::marker_observation, QDateTime::currentDateTime(), "1"));
_model->addMarker(new MarkerItem(QPointF(22.5391f, 88.3958f), MarkerItem::marker_observation, QDateTime::currentDateTime(), "2"));

qRegisterMetaType<MarkerModel*>("MarkerModel");
QWidget* container = QWidget::createWindowContainer(_view, this);
container->setFocusPolicy(Qt::TabFocus);
_view->engine()->rootContext()->setContextProperty("markerModel", _model);
_view->setSource(QUrl("qrc:///main.qml"));

QVBoxLayout* layout = new QVBoxLayout;
setLayout(layout);

layout->addWidget(container);

_root = _view->rootObject();

Первые две точки, которые добавляются перед установкой модели в контекст QML, отображаются в представлении. Однако, когда я добавляю несколько новых точек (на основе пользовательского ввода из действия панели инструментов) с addMarker Функция добавляет маркеры в модель, но вид не обновляет

Все коды в проекте загружены в суть

1 ответ

Решение

Можно сказать, что проблема заключается в том, что это в вашем коде или в ваших данных, что происходит в том случае, если данные, которые вы возвращаете, находятся в географических координатах.

Если вы хотите сохранить свои данные, вам нужно только изменить следующее:

coordinate: QtPositioning.coordinate(position.y, position.x)

Если вы не хотите менять свой код, обменяйте координаты в ваших данных.

Я выбрал первый вариант и, немного переместив карту, получил следующее:

введите описание изображения здесь

Другие вопросы по тегам