下面的应用程序输出从一个QQuickItem映射到另一个object mapToItem(Item item, real x, real y)的坐标。根据文档:


mapped.x
将项目坐标系中的点(x,y)或rect(x,y,width,height)映射到项目的坐标系,并返回具有x和y(以及宽度和高度)属性匹配的对象映射的坐标。


我希望输出是这样的:


0 0
1 1
2 2


但我得到:

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


为什么QPointF的类型是mapped?我希望它是一个浮点值。什么是实际的mapToItem类型?

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);
                }
            }
        }
    }
}


UPDATE1:QQuickItemmapToItem带2个参数,而Item的带3个参数。上面的代码中调用了哪一个?

最佳答案

在您的情况下,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;不可使用,即,它不会从C ++公开给QML。其次,QQuickItem::mapToItem(const QQuickItem *item, const QPointF &point) const;直接返回一个QPointF内部属性称为xpyp而不是xy的内部属性(可以使用调试器观察)。

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


普通双值
N
+∞
−∞
-0
+0。


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

从Qt 5.2开始使用了一个新的JavaScript引擎。在5.1及更低版本中,使用了V8,它向QML返回了NaN而不是QPointF

10-05 18:36