4

下面的应用程序输出从一个映射QQuickItem到另一个的坐标。根据文档:

object mapToItem(Item item, real x, real y)
将位于此项的坐标系中的点 (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  

为什么是mapped.xa的类型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);
                }
            }
        }
    }
}

UPDATE1: QQuickItemmapToItem2 个 args,而ItemmapToItem3 个 args。上面的代码中调用了哪一个?

4

1 回答 1

4

在您的情况下,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直接调用谁的内部属性的xpandyp而不是xand y(这可以使用调试器观察到)。

In QQuickItem::mapToItem() xandy被 C++ 强制为 type qreal,这是 C++ 的别名double。甚至if (v = (*args)[1])->asDouble()完全吓坏了,x一定是

  • 普通双值
  • +∞</li>
  • -∞
  • -0
  • +0。

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

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

于 2014-01-08T21:51:55.683 回答