下面的应用程序输出从一个QQuickItem映射到另一个的坐标。根据医生的说法:
object mapToItem(Item item, real x, real y)将项目坐标系中的点(x,y,宽度,高度)映射到项的坐标系中,并返回具有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);
}
}
}
}
}UPDATE1: QQuickItem有两个args的mapToItem,项目有三个args的mapToItem。在上面的代码中,哪一个被调用?
发布于 2014-01-08 21:51:55
在您的例子中,mapToItem需要3个参数。你不需要先创造一个点。
onPositionChanged: {
var mapped = r.mapToItem(r0, mouse.x, mouse.y);
console.log(mapped.x, ' ', mapped.y);
}背景说明:这似乎是一个bug,我只是已报告。
您的代码调用QQuickItem::mapToItem()有两个原因。首先,QQuickItem::mapToItem(const QQuickItem *item, const QPointF &point) const;是不可调用的,即它不会从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)。从那时起,其余的计算就没有任何意义了,但是错误处理缺失了。
有一个新的JavaScript引擎从Qt5.2开始使用。在5.1和之前,使用了V8,它向QML返回一个NaN而不是一个QPointF。
https://stackoverflow.com/questions/21001124
复制相似问题