Что такое тип возврата QQuickItem::mapToItem?

Приложение ниже выводит координаты, сопоставленные с одним QQuickItem другому. Согласно документам:

object mapToItem(Item item, real x, real y)
Сопоставляет точку (x, y) или прямоугольник (x, y, width, height), которая находится в системе координат этого элемента, с системой координат элемента и возвращает объект, свойства которого соответствуют x и y (и, возможно, ширине и высоте) сопоставленная координата.

Я ожидаю, что результат будет примерно таким:

0 0
1 1
2 2

но я получаю:

QPointF(9, 6)   100  
QPointF(9, 5)   100  
QPointF(8, 5)   100  

Почему тип mapped.x QPointF? Я ожидал, что это будет значение с плавающей точкой. Что является актуальным mapped тип?

import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0
import QtQuick.Layouts 1.0

ApplicationWindow {
    width: 640
    height: 480

    Rectangle {
        anchors.fill: parent
        id: r0
        color: "green"
        Rectangle {
            x: 50; y:100; width: 100; height: 100;
            id: r
            color: "yellow"
            MouseArea {
                id: mousearea
                anchors.fill: parent
                hoverEnabled: true
                onPositionChanged: {
                    var mouseP = Qt.point(mouse.x, mouse.y);
                    var mapped = r.mapToItem(r0, mouseP);
                    console.log(mapped.x, ' ', mapped.y);
                }
            }
        }
    }
}

ОБНОВЛЕНИЕ 1 : QQuickItem имеет mapToItem с 2 аргами и предметом mapToItem с 3 аргументами. Какой из них вызывается в коде выше?

1 ответ

Решение

В твоем случае, mapToItem ожидает 3 параметра. Вам не нужно сначала создавать точку.

onPositionChanged: {
    var mapped = r.mapToItem(r0, mouse.x, mouse.y);
    console.log(mapped.x, ' ', mapped.y);
}

Справочное примечание: Это похоже на ошибку, о которой я только что сообщил.

Ваш код вызывает QQuickItem::mapToItem() по двум причинам. Первый, QQuickItem::mapToItem(const QQuickItem *item, const QPointF &point) const; не является INVOKABLE, то есть он не предоставляется из C++ в QML. Во-вторых, QQuickItem::mapToItem(const QQuickItem *item, const QPointF &point) const; возвращает QPointF напрямую, чьи внутренние свойства называются xp а также yp вместо x а также y (это можно наблюдать с помощью отладчика).

В QQuickItem::mapToItem()x а также y вынуждаются C++ иметь тип qreal, который является псевдонимом для C++ double, Четное if (v = (*args)[1])->asDouble() сходит с ума полностью, x должно быть

  • обычное двойное значение
  • NaN
  • + ∞
  • -∞
  • -0
  • +0.

В вашем случае это должно быть NaN, y = 0 потому что параметр 3 не установлен. Таким образом, точка (NaN, 0) создано. С этого момента остальные вычисления не имеют никакого смысла, но обработка ошибок отсутствует.

Начиная с Qt 5.2 используется новый движок JavaScript. В 5.1 и ранее использовался V8, который возвращает NaN вместо QPointF в QML.

Другие вопросы по тегам