MapQuickItem не отображается в карте QML
Я хочу нарисовать круг динамически (через C++) на QML
Карта, но в зависимости от zoomLevel, круг может быть не виден. MapCircle
не имеет свойства zoomLevel. Итак, я сначала создаю MapQuickItem
и пытается поставить MapCircle
как его sourceItem
, в QML у меня есть
function add_point(lat, lng){
var circle = Qt.createQmlObject('import QtLocation 5.3; MapCircle { }', map, "dynamic");
circle.center = QtPositioning.coordinate(lat, lng);
circle.radius = 5.0;
circle.color = 'blue';
circle.border.width = 1;
var item = Qt.createQmlObject('import QtLocation 5.3; MapQuickItem{}', map, "dynamic");
item.anchorPoint.x = 2.5;
item.anchorPoint.y = 2.5;
item.coordinate = QtPositioning.coordinate(lat, lng);
item.sourceItem = circle;
item.zoomLevel = 19.0
map.addMapItem(item);
map.points.push(item);
return true;
}
Если я просто нарисую MapCircle
на карте виден круг, однако с помощью приведенного выше кода на экране ничего не отображается zoomLevel
Я попытался удалить zoomLevel
собственности, но все равно ничего не появляется.
1 ответ
MapQuickItem используется для добавления стандартных QQuickItems на карту. Хотя MapCircle является QQuickItem, это не то, что вы должны поместить туда. Если вы хотите добавить круг на карту с помощью MapQuickItem, вы должны добавить Rectangle в качестве исходного элемента с соответствующим радиусом. Оба следующих подхода работают
var item = Qt.createQmlObject('import QtQuick 2.7; import QtLocation 5.3; MapQuickItem{}', map, "dynamic");
item.anchorPoint.x = Qt.point(2.5,2.5)
item.coordinate = QtPositioning.coordinate(lat, lng);
item.zoomLevel = 10
var circle = Qt.createQmlObject('import QtQuick 2.7; Rectangle{ width: 32; height: 32; radius: 16}', map);
item.sourceItem = circle
map.addMapItem(item);
а также
var item = Qt.createQmlObject('import QtQuick 2.7; import QtLocation 5.3; MapQuickItem{ sourceItem: Rectangle{ width: 32; height: 32; radius: 16}}', map, "dynamic");
item.anchorPoint.x = Qt.point(2.5,2.5)
item.coordinate = QtPositioning.coordinate(lat, lng);
item.zoomLevel = 10
map.addMapItem(item);
Имейте в виду, что размер прямоугольника означает размер в пикселях. Когда вы устанавливаете zoomLevel на MapQuickItem, он становится пикселями с этим уровнем масштабирования. Это означает, что при уровне масштабирования 10 прямоугольник будет иметь ширину 32 пикселя. На уровне масштабирования 9 это будет 16 и так далее. Кстати, если вы хотите управлять видимостью в зависимости от уровня масштабирования, вам лучше написать свойство visible. Что-то вроде:
item.visible: map.zoomLevel > 10