我的目的是将平面到坐标的距离作为地图上的一个项目来表示。即使很难显示自定义矩形组件,我也很难显示MapQuickItem。我不知道问题在哪里?
编辑:我认为Box.qml没有问题。请省略我没有传递给组件的属性值。
Box.qml
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
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
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" }
}
}
}发布于 2021-05-06 06:28:01
由于Box.qml文件是本地的,所以没有必要使用statusChanged来简化逻辑以:
distanceBoxCreation.js
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
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"
}
}
}注意:对于这个例子,我已经消除了不相关的部分。
https://stackoverflow.com/questions/67403008
复制相似问题