下面的应用程序输出从一个QQuickItem
映射到另一个object mapToItem(Item item, real x, real y)
的坐标。根据文件:
QPointF(9, 6) 100 QPointF(9, 5) 100 QPointF(8, 5) 100
将点(x,y)或矩形(x,y,宽度,高度)(在此项的坐标系中)映射到项的坐标系,并返回具有x和y(以及可选的宽度和高度)属性匹配的对象映射的坐标。
我希望输出是这样的:
0 0
1 1
2 2
但我明白了:
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);
}
}
}
}
}
类型?
mapToItem
UPDATE1: QQuickItem mapToItem
有两个args,Item有{{1}}有3个args。在上面的代码中调用了哪一个?
答案 0 :(得分:4)
在您的情况下,mapToItem
需要3个参数。您不需要先创建一个点。
onPositionChanged: {
var mapped = r.mapToItem(r0, mouse.x, mouse.y);
console.log(mapped.x, ' ', mapped.y);
}
背景说明:这似乎是一种错误,我只是reported。
您的代码调用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
。 y = 0
因为未设置参数3。因此创建了一个点(NaN, 0)
。从那时起,其余的计算没有任何意义,但缺少错误处理。
从Qt 5.2开始使用了一个新的JavaScript引擎。在5.1及之前,使用了V8,它将NaN
而不是QPointF
返回给QML。