Что такое тип возврата 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.