首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QML在Qt上动态创建MapQuickItem

QML在Qt上动态创建MapQuickItem
EN

Stack Overflow用户
提问于 2021-05-05 14:10:44
回答 1查看 555关注 0票数 0

我的目的是将平面到坐标的距离作为地图上的一个项目来表示。即使很难显示自定义矩形组件,我也很难显示MapQuickItem。我不知道问题在哪里?

编辑:我认为Box.qml没有问题。请省略我没有传递给组件的属性值。

Box.qml

代码语言:javascript
复制
import QtQuick 2.0
import QtPositioning 5.12
import QtLocation 5.12



MapQuickItem{
    property var lat: 0
    property var lon: 0
    property var distance: 0

    id:distanceBoxId
    anchorPoint.x:mainRect.width/2
    anchorPoint.y:mainRect.height/2
    sourceItem: Rectangle{
        id:mainRect
        color: "red"
        height: 100
        width: 100
    }
    coordinate: QtPositioning.coordinate(lat,lon)
}

distanceBoxCreation.js

代码语言:javascript
复制
var component;
var sprite;

function createSpriteObjects(distance_moc,lat,lon) {
    component = Qt.createComponent("Box.qml");
    if (component.status == Component.Ready){
        finishCreation(distance_moc,lat,lon);
        console.log("item ready")
    }
    else
        component.statusChanged.connect(finishCreation);
}

function finishCreation(distance_moc,latitude,longitude) {
    if (component.status == Component.Ready) {
        console.log("tester" + latitude + " "+ longitude);

        sprite = component.createObject(map, {distance: distance_moc,lat:latitude,lon:longitude});
        if (sprite == null) {
            // Error Handling
            console.log("Error creating object");
        }
    } else if (component.status == Component.Error) {
        // Error Handling
        console.log("Error loading component:", component.errorString());
    }
}

main.qml

代码语言:javascript
复制
import QtQuick.Window 2.2
import QtLocation 5.9
import QtPositioning 5.8
import QtQuick.Controls 2.12
import QtQuick.Controls.Styles 1.4
import QtQuick 2.10
import "distanceBoxCreation.js" as MyScript



ApplicationWindow {
    id:mainAppId
    visible: true
    width: 640
    height: 480


    property var uav_latitude:0
    property var uav_longitude:10
    property var distance



    function addWaypointIndicator(latitude,longitude){
        waypointModelId.append({lat : latitude, lon:longitude})
        mapPolylineId.addCoordinate(QtPositioning.coordinate(latitude,longitude))
    }

    function focusOnUav(){
        map.center=QtPositioning.coordinate(uav_latitude,uav_longitude)
    }


    function focusOnLocation(index){
        map.center=QtPositioning.coordinate(waypointModelId.get(index).lat,waypointModelId.get(index).lon)
    }

    function getDistanceToCoordinate(target_coordinate){
        return mainUavId.coordinate.distanceTo(target_coordinate)
    }

    function clearWaypoints(waypointlist){
        waypointlist.clear()
        mapPolylineId.path=[]
    }

    function packageWaypoints(waypointlist){
        console.log("waypoint list is:",waypointlist)
    }

    ListModel {
        id: waypointModelId
    }



    Map {
        id: map
        anchors.fill: parent
        plugin: Plugin {name: "osm"}
        center: QtPositioning.coordinate(20.5, -2.5)
        zoomLevel: 13


        MapQuickItem{
            id:mainUavId
            anchorPoint.x:mainUavImageId.width/2
            anchorPoint.y:mainUavImageId.height/2
            sourceItem: Image {
                id: mainUavImageId
                source: "qrc:/uav.png"
                height: 50
                width: 50
            }
            coordinate: QtPositioning.coordinate(uav_latitude,uav_longitude)
        }


        MapPolyline {
            id:mapPolylineId
            line.width: 7
            line.color: 'orange'
            path: [ ]
        }

        Repeater{
            model: waypointModelId
            MapItemGroup {
                id: delegateGroup
                MapCircle{
                    id:mapCircleId
                    center:QtPositioning.coordinate(model.lat, model.lon)
                    radius: 750.0
                    color: 'red'
                    border.width: 3
                    opacity: 0.7
                }
                MapRectangle {
                    id: innerRect
                    border.color: "red"
                    border.width: 6
                    topLeft     : QtPositioning.coordinate(model.lat+0.002, model.lon-0.002)
                    bottomRight : QtPositioning.coordinate(model.lat-0.002, model.lon+0.002)
                }

                Component.onCompleted: {
//                    MyScript.createSpriteObjects(distance,uav_latitude,uav_longitude);
                    map.addMapItemGroup(this)
                }
            }
        }
        MouseArea{
            property var target_coord:map.toCoordinate(Qt.point(mouseX, mouseY))
            property var target_coord_lat
            property var target_coord_lon
            anchors.fill: parent
            onDoubleClicked: {
                target_coord=map.toCoordinate(Qt.point(mouse.x,mouse.y))
                target_coord_lat=target_coord.latitude
                target_coord_lon=target_coord.longitude
                addWaypointIndicator(target_coord_lat,target_coord_lon)
                distance=getDistanceToCoordinate(target_coord)
                MyScript.createSpriteObjects(distance,target_coord_lat,target_coord_lon);
            }
        }
        Button{
            x:100
            y:100
            text:"focus on uav"
            onClicked: {
                focusOnUav()
            }
        }
        Button{
            x:100
            y:150
            text:"focus on waypoint"
            onClicked: {
                focusOnLocation(waypointTextId.text)
            }
        }
        Button{
            x:100
            y:200
            text:"clear waypoints"
            onClicked: {
                clearWaypoints(waypointModelId)
            }
        }
        TextField {
            id:waypointTextId
            color: "white"
            background: Rectangle { color: "black" }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-06 06:28:01

由于Box.qml文件是本地的,所以没有必要使用statusChanged来简化逻辑以:

distanceBoxCreation.js

代码语言:javascript
复制
function createSpriteObjects(map, distance, latitude, longitude) {
    var component = Qt.createComponent("Box.qml");
    var sprite = component.createObject(map, {distance: distance, lat:latitude, lon:longitude});
    return sprite;
}

然后可以创建项目,但必须使用addMapItem方法将其添加到映射中。

main.qml

代码语言:javascript
复制
import QtLocation 5.9
import QtPositioning 5.8
import QtQuick 2.10
import QtQuick.Controls 2.12
import "distanceBoxCreation.js" as MyScript

ApplicationWindow {
    function getDistanceToCoordinate(target_coordinate) {
        return mainUavId.coordinate.distanceTo(target_coordinate);
    }

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

    Map {
        id: map

        anchors.fill: parent
        center: QtPositioning.coordinate(20.5, -2.5)
        zoomLevel: 13

        MapQuickItem {
            id: mainUavId

            anchorPoint.x: 10
            anchorPoint.y: 10
            coordinate: QtPositioning.coordinate(20.5, -2.5)

            sourceItem: Image {
                id: mainUavImageId

                source: "qrc:/uav.png"
                height: 50
                width: 50
            }

        }

        MouseArea {
            anchors.fill: parent
            onDoubleClicked: {
                var target_coord = map.toCoordinate(Qt.point(mouse.x, mouse.y));
                var target_coord_lat = target_coord.latitude;
                var target_coord_lon = target_coord.longitude;
                var distance = getDistanceToCoordinate(target_coord);
                var sprite = MyScript.createSpriteObjects(map, distance, target_coord_lat, target_coord_lon);
                map.addMapItem(sprite);
            }
        }

        plugin: Plugin {
            name: "osm"
        }

    }

}

注意:对于这个例子,我已经消除了不相关的部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67403008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档