首页 > 解决方案 > 如何使用 Q_PROPERTY() 将折线路径从 C++ 传递到 QML

问题描述

我正在尝试使用从 C++ 到 QML 的路径Q_PROPERTY(QVariantList path READ path),但它显示一条错误消息QML MapPolyline: Unsupported path type

当我在谷歌上搜索哪种数据类型适合将路径从 C++ 传递到 QML 时,结果表明我可以(也许只能)使用 QVariantList、QVariant::fromValue() 和 QGeoCoordinate。所以,据此,我的代码是这样的:

在 cpp 中(摘要)

Q_PROPERTY(QVariantList path READ path NOTIFY pathChanged)
QVariantList path() {
    return m_path;
}

signals:
    void pathChanged();

void DroneModel::addMarker(QObject *marker, double latitude, double longitude) {
    drone->addMarker(marker, latitude, longitude);
    QGeoCoordinate *coord = new QGeoCoordinate(latitude, longitude, 0);
    if (coord->isValid()) {
        m_path.append(QVariant::fromValue(coord));
    }

    emit pathChanged();
}

在 QML 中

Map {
    id: map
    ...
    MapPolyline {
        id: dronePath
        line.color: 'green'
        line.width: 3
        path: droneModel.path
        /* in main.cpp, 
         * engine.rootContext()->setContextProperty("droneModel", &droneModel);
         */
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            var targetLocation = Qt.point(mouse.x, mouse.y);
            map.addMarker(targetLocation);
        }
    }

    function addMarker(targetLocation) {
        var component = Qt.createComponent("qrc:/marker.qml");
        var marker = component.createObject();
        var targetCoordinate = map.toCoordinate(targetLocation);

        droneModel.addMarker(marker, targetCoordinate.latitude, targetCoordinate.longitude);
    }
}

实际上,我找到了一种使用 C++ 和 QML 制作折线的方法,但它没有使用 Q_PROPERTY() 和path: droneModel.path.

有没有使用 Q_PROPERTY() 的方法?
提前致谢。

标签: qtqml

解决方案


解决了:

在cpp中,

if (coord->isValid()) {
    m_path.append(QVariant::fromValue(*coord));
}

正在工作而不是

if (coord->isValid()) {
    m_path.append(QVariant::fromValue(coord));
}

推荐阅读