LINUX.ORG.RU

Наличие и отсутствие двоеточия: поясните за синтаксис QML

 , ,


0

1

Прочитав документацию вот тут:

http://doc.qt.io/qt-5/qml-coordinate.html

Написал такой код:

Item {
    id: root

    property double geoTransportLatitude: 0
    property double geoTransportLongitude: 0

    ...

    Location {
        id: location

        coordinate {
            latitude: root.geoTransportLatitude
            longitude: root.geoTransportLongitude
        }
    }

    Binding
    {
        target: map
        property: "center"
        value: location.coordinate
        when: location.coordinate.isValid
    }

И он работает. А потом думаю: стоп, чего это он работает? В биндинге идет обращение к полю coordinate элемента location. А значение поля coordinate в элементе location не задано! Есть какой-то странный вложенный элемент с типом coordinate (почему-то с маленькой буквы), но он же не задает _значение_поля_ coordinate.

Взял, и поставил двоеточие после coordinate в элементе location, вот так:
        coordinate: {
            latitude: root.geoTransportLatitude
            longitude: root.geoTransportLongitude
        }

И получил ошибку:
MapArea.qml:90:21: Unable to assign double to QGeoCoordinate

Теперь сижу и думаю: что эта запись БЕЗ двоеточия означает? Почему при описании свойства coordinate двоеточие ставить не нужно? Каким волшебным образом вложенный элемент преобразуется в значение поля?

★★★★★

Запись без двоеточия означает доступ к элементу поля. Твою запись

coordinate {
            latitude: root.geoTransportLatitude
            longitude: root.geoTransportLongitude
           }

можно раскрыть в

coordinate.latitude: root.geoTransportLatitude
coordinate.longitude: root.geoTransportLongitude

Если ты ставишь двоеточие, то ты должен заассайнить тип QGeoCoordinate

coordinate: QtPositioning.coordinate(root.geoTransportLatitude, root.geoTransportLongitude)

У типа Location http://doc.qt.io/qt-5/qml-qtpositioning-location.html есть пропертя coordinate с типом coordinate. Выглядит странно, но так решили. Ты не создаешь рандомную координату, ты обращаешься к проперте.

ncuxer
()
Последнее исправление: ncuxer (всего исправлений: 1)
Ответ на: комментарий от ncuxer

пропертя coordinate с типом coordinate

Это базовый тип, он создаётся только через методы, это не объект, у него нет вложенных пропертей, к которым можно биндиться и т.д. Можно считать такие типы структурами данных.

С другой стороны тип объекта всегда начинается с большой буквы и его можно присваивать default-проперте без явного указания её имени. В принципе, конфликтов в синтаксисе при этом я не вижу. Если вложенный элемент начинается с большой буквы — это создание нового объекта с таким типом, если с маленькой — это просто синтаксический сахар для уже существующей проперти.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.