gpt4 book ai didi

qt - 来自 C++ 模型的 QML MapPolygon

转载 作者:行者123 更新时间:2023-12-04 13:19:17 29 4
gpt4 key购买 nike

我想动态添加/删除/编辑 MapPolygon在 QML map 应用程序中。我还有其他一些创建多边形的工作(文件导出/导入等),所以我认为我应该使用 MapItemView使用 C++ 模型 sotirng Polygons 数据。

我试图用我自己的基于 QObject 的对象创建我自己的模型:

目的:

class MODELSHARED_EXPORT Polygon : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<QGeoCoordinate> coordinates READ coordinates WRITE setCoordinates NOTIFY coordinatesChanged)

public:
explicit Polygon(QObject *parent = nullptr);

QList<QGeoCoordinate> coordinates() const;

void setCoordinates(QList<QGeoCoordinate> coordinates);
signals:
void coordinatesChanged(QList<QGeoCoordinate> coordinates);

public slots:
void addCoordinate(const QGeoCoordinate & coordinate);

private:
QList<QGeoCoordinate> m_coordinates;
};

模型:
class MODELSHARED_EXPORT PolygonModel : public QAbstractListModel
{
...

QVariant data(const QModelIndex &index, int role) const override
{
if(index.row() >= 0 && index.row() < rowCount()) {
switch (role) {
case CoordinatesRole:
return QVariant::fromValue(m_data.at(index.row())->coordinates());
}
}

return QVariant();
}

public slots:
void addArea()
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_data.append(new Polygon(this));
endInsertRows();
}

void addPolygonCoordinate(const QGeoCoordinate &coordinate, int index)
{
if(index == -1) {
index = rowCount() - 1;
}

m_data.at(index)->addCoordinate(coordinate);
dataChanged(this->index(0), this->index(rowCount() - 1));
qDebug() << "Adding coordinate..." << coordinate;
}

private:
QList<Polygon*> m_data;
};

和 QML:
MapItemView {
id: AreaView
delegate: AreaPolygon {
path: coordinates
}
model: cppPolygonModel
}

区域多边形.qml
MapPolygon {
id: areaPolygon
border.width: 1
border.color: "red"
color: Qt.rgba(255, 0, 0, 0.1)
}

但不幸的是多边形没有出现在 map 上(当坐标成功添加到对象 QList 属性时)。我认为 Object QList addidion 从 View 中不可见,因此 MapItemView 不刷新。

有没有更好的选择来做到这一点?也许我应该使用 QGeoPolygon 的模型对象? (如何?)

最佳答案

您必须返回 QVariantList而不是 QList<QGeoCoordinate> :

if(index.row() >= 0 && index.row() < rowCount()) {
switch (role) {
case CoordinatesRole:
QVariantList coorvariant;
for(const QGeoCoordinate & coord: m_data.at(index.row())->coordinates()){
coorvariant.append(QVariant::fromValue(coord));
}
return coorvariant;
}
}

enter image description here

关于qt - 来自 C++ 模型的 QML MapPolygon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428077/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com