Reputation: 131
I want to drag a MapQuickItem which is declare inside the component and gets real time coordinates from map. When run the code I get the error "qrc:/main.qml:15: ReferenceError: mouseArea is not defined" like this.How to access mouseAea outside the component ? Or where to declare the dragged property to get access mousearea ?
Window {
id: window
width: 800
height: 800
visible: true
property bool dragged: mouseArea.drag.active
Plugin
{
id: hereMaps
name: "here"
PluginParameter { name: "here.app_id"; value: "oBB4FivcP23m2UZQCj8K" }
PluginParameter { name: "here.token"; value: "P-D8XRRGeVt0YphUuOImeA" }
}
Map {
id: mapOfWorld
anchors.centerIn: parent;
anchors.fill: parent
activeMapType: supportedMapTypes[1];
zoomLevel: 18
plugin: hereMaps
center: QtPositioning.coordinate(19.997454, 73.789803)
MouseArea{
id : mapAreaClick
height: mapOfWorld.height
width: mapOfWorld.width
hoverEnabled: true
anchors.fill: mapOfWorld
preventStealing : true
propagateComposedEvents : true
anchors.centerIn: mapOfWorld
}
Component { // here error occurs
id : test
MapQuickItem
{
id: anchor
coordinate: QtPositioning.coordinate(19.997454, 73.789803)
sourceItem: Item {
Rectangle {
id: handle
color: "red"
width: 40
height: 40
radius: 40
x: anchor.x - width
y: anchor.y - height
Drag.active: true
MouseArea {
id: mouseArea
drag.target: handle
drag.threshold: 0
anchors.fill: parent
}
Connections {
target: anchor
onXChanged: if (!dragged) x = anchor.x - width
onYChanged: if (!dragged) y = anchor.y - height
}
onXChanged: {
console.log("X:"+x)
var cordinate = mapOfWorld.toCoordinate((Qt.point((x),(y))));
console.log("onXChanged :" , cordinate)
if (dragged) anchor.x = x + width
}
onYChanged:{
console.log("Y:"+y)
var cordinate = mapOfWorld.toCoordinate((Qt.point((x),(y))));
console.log("onYChanged : ", cordinate)
if (dragged) anchor.y = y + height
}
}
}
}
}
}
}
Upvotes: 0
Views: 794
Reputation: 809
When I saw this question, I thought that you are trying to reinvent the wheel. I have never worked before with Maps in Qt, but AFAIK Qt I was sure there must be easiest way to reach your goal. So here you have a little bit different solution. Simpler, in my opinion:
Window {
...
Map {
id: map
anchors.fill: parent
activeMapType: supportedMapTypes[1];
zoomLevel: 18
plugin: hereMaps
center: QtPositioning.coordinate(19.997454, 73.789803)
MapItemView {
id: markerItem
model: [
{ id: "marker1", color: "red" },
{ id: "marker2", color: "green" },
{ id: "marker3", color: "blue" }
]
delegate: mapMarkerComponent
}
Component {
id : mapMarkerComponent
MapQuickItem {
id: mapMarker
coordinate: QtPositioning.coordinate(19.997454, 73.789803)
sourceItem: Rectangle {
id: handle
color: modelData.color
width: 40
height: 40
MouseArea {
drag.target: parent
anchors.fill: parent
}
onXChanged: {
mapMarker.x += x
}
onYChanged: {
mapMarker.y += y
}
}
onCoordinateChanged: {
console.log(modelData.id + ":" + coordinate);
}
}
}
}
}
I think everything there explains itself :)
Upvotes: 1
Reputation: 879
mouseArea
is not defined because there is no object created. So you have to create the object from test
component var anchorItem = test.createObject()
and then add it to your mapOfWorld.addMapItem(anchorItem)
Window {
id: window
...
//property bool dragged: mouseArea.drag.active
Map{
id: mapOfWorld
...
Component { // here error occurs
id : test
MapQuickItem
{
id: anchor
//moved here
property bool dragged: mouseArea.drag.active
...
}
//create our anchor object///
Component.onCompleted : {
var mapAnchor = test.createObject()
mapOfWorld.addMapItem(mapAnchor)
}
}
}
Upvotes: 1