背景
某些情况下我们无法使用anchors该属性,因为anchors的目标只能是父对象或者同级对象。使用mapFromItem或者mapToItem可以很好的解决这个问题,但是使用这两个函数有一些坑需要注意。
mapFromItem 与 mapToItem
本文不着重介绍这两个函数,侧重讲解使用过程规避的坑。这里简单引用一下。
mapFromItem
的原文介绍为:
object mapFromItem(Item item, point p)
object mapFromItem(Item item, real x, real y)
object mapFromItem(Item item, real x, real y, real width, real height)
object mapFromItem(Item item, rect r)
Maps the point (x, y) or rect (x, y, width, height), which is in item's coordinate system, to this item's coordinate system, and returns a point or rect matching the mapped coordinate.
The following properties of the item are used in the mapping: x, y, scale, rotation, transformOrigin, and transform.
If item is a null value, this maps the point or rect from the coordinate system of the root QML view.
The versions accepting point and rect are since Qt 5.15.
意思是将函数调用者
所在坐标系中的(x,y)映射到item
所在的坐标系中,返回映射后的点。
mapToItem
的原文介绍为:
object mapToItem(Item item, point p)
object mapToItem(Item item, real x, real y)
object mapToItem(Item item, real x, real y, real width, real height)
object mapToItem(Item item, rect r)
Maps the point (x, y) or rect (x, y, width, height), which is in this item's coordinate system, to item's coordinate system, and returns a point or rect matching the mapped coordinate.
The following properties of the item are used in the mapping: x, y, scale, rotation, transformOrigin, and transform.
If item is a null value, this maps the point or rect to the coordinate system of the root QML view.
The versions accepting point and rect are since Qt 5.15.
意思是将item
所在坐标系中的(x,y)映射到函数调用者
所在的坐标系中,返回映射后的点。
示例
如果你有一个item
控件想要排列在image
的底部居中,这种情况下无法使用anchors
属性,因为image
不是item
的父对象或同级对象。使用mapFromItem或者mapToItem的最好方法是等待item
与image
均加载完成后再通过binding
函数布局。
import QtQuick 2.15
Window {
id: root
function
Item {
id: item
// 以下这种做法有问题,当image控件还没加载完成的时候,会显示异常
// x: item.mapFromItem(image, image.width/2, image.height).x
// y: item.mapFromItem(image, image.width/2, image.height).y
}
Control {
id: control
Image {
id: image
Component.onCompleted: {
item.x = Qt.binding(function() { return root.mapFromItem(image, image.width/2, image.height).x; })
item.y = Qt.binding(function() { return root.mapFromItem(image, image.width/2, image.height).y; })
}
anchors.centerIn: parent
width: 100
heigth: 100
}// Image
}// Control
}// Window