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
Другие вопросы по тегам