什么是QQuickItem :: mapToItem返回类型?

时间:2014-01-08 16:24:40

标签: qt qml qtquick2 qquickitem

下面的应用程序输出从一个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。在上面的代码中调用了哪一个?

1 个答案:

答案 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代替xy(这可以使用调试器)。

QQuickItem::mapToItem() xy被C ++强制为qreal类型,这是C ++ double的别名。即使if (v = (*args)[1])->asDouble()完全吓坏了,x也必须

  • 普通双值
  • 的NaN
  • +∞
  • -∞
  • -0
  • 0

在您的情况下,它应该是NaNy = 0因为未设置参数3。因此创建了一个点(NaN, 0)。从那时起,其余的计算没有任何意义,但缺少错误处理。

从Qt 5.2开始使用了一个新的JavaScript引擎。在5.1及之前,使用了V8,它将NaN而不是QPointF返回给QML。