我正在嘗試使用maptoItem()函式,當我在內部使用它時它可以作業,但當我main.qml直接在我的內部使用時它不起作用custom item.qml,我不知道為什么?
main.qml
Item{
id:root_toggle
width: parent.width
height: parent.height
//... code here Column Item etc that changes the y,x position of ToggleAbleItem
ToggleAbleItem{
id:second_toggle_item
Text {
id:fsdfsd
text: "text2"
color: "blue"
font.pixelSize: 24
}
Component.onCompleted: {
var l = second_toggle_item.mapToItem(root_toggle, 0, 0)
console.log(l)
}
}
}
//... code here
控制臺日志正確列印[debug] expression for onCompleted (qrc:/main.qml:182) - QPointF(0, 42)
ToggleAbleItem.qml
Item{
id: id_toggleable_item
implicitHeight: childrenRect.height
implicitWidth: childrenRect.width
readonly property point absolute_position: id_toggleable_item.mapToItem(root_toggle, 0, 0)
Component.onCompleted: {
console.log(absolute_position)
}
}
控制臺日志列印錯誤值[debug] expression for onCompleted (qrc:/ToggleFunctionality/ToggleAbleItem.qml:53) - QPointF(0, 0)
有人可以向我解釋為什么它一次正確映射而另一次不正確嗎?
我使用了完全相同的專案和 ID。
編輯1:
目標不是使用parent,因為它可能是第 6 個孩子等......
我也嘗試過設定property Item my_root_item: root_toggle, ToggleAbleItem.qml 然后我也嘗試過 main.qml
uj5u.com熱心網友回復:
所以這基本上是一個系結評估的問題。當ToggleableItem創建并absolutePosition評估屬性時,專案的定位尚未完成,并且由于系結陳述句未連接到會觸發重新評估的專案的任何幾何屬性,該屬性保持其初始值 (0, 0)。
一種解決方案是toggleableItem.y在系結運算式前面添加 ,以便在y屬性更改時始終重新評估系結。基本上,使系結依賴于在重新定位專案時更改的幾何屬性。
另一種解決方案是創建一個函式absolutePositionFunc(),當您需要獲取絕對位置時,在定位完成后呼叫該函式。
import QtQuick
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Item {
id: rootToggle
anchors.fill: parent
Column {
ToggleableItem {
id: toggleItem1
rootItem: rootToggle
color: "red"
Component.onCompleted: console.log("toggle item #1", toggleItem1.mapToItem(rootToggle, 0, 0))
}
ToggleableItem {
id: toggleItem2
rootItem: rootToggle
color: "green"
Component.onCompleted: console.log("toggle item #2", toggleItem2.mapToItem(rootToggle, 0, 0))
}
onPositioningComplete: {
console.log(toggleItem1.absolutePosition,
toggleItem1.absoultePositionFunc())
console.log(toggleItem2.absolutePosition,
toggleItem2.absoultePositionFunc())
}
}
}
}
ToggleableItem.qml
import QtQuick
Rectangle {
id: toggleableItem
required property Item rootItem
readonly property point absolutePosition: {
toggleableItem.y // geometric property in binding to trigger re-evaluation
return toggleableItem.mapToItem(toggleableItem.rootItem, 0, 0)
}
function absolutePositionFunc() {
return toggleableItem.mapToItem(toggleableItem.rootItem, 0, 0)
}
width: 100
height: 40
Component.onCompleted: console.log("absoulte position",
toggleableItem.absolutePosition)
}
uj5u.com熱心網友回復:
看看我對你的問題的評論。這是使用該parent屬性的解決方案。同樣,不要在不同的檔案中使用 id。
import QtQuick
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Item {
id: rootToggle
anchors.fill: parent
ToggleableItem {
id: secondToggleItem
x: 50
y: 50
Text {
text: "text2"
color: "blue"
font.pixelSize: 24
}
Component.onCompleted: console.log(secondToggleItem.mapToItem(rootToggle, 0, 0))
}
}
}
ToggleableItem.qml
import QtQuick
Item {
id: idToggleableItem
implicitHeight: childrenRect.height
implicitWidth: childrenRect.width
readonly property point absolutePosition: idToggleableItem.mapToItem(parent, 0, 0)
Component.onCompleted: console.log(idToggleableItem.absolutePosition)
}
uj5u.com熱心網友回復:
我必須在函式內部完成后分配值Component.onCompleted(),然后該值不再為 0。我還選擇了mapFromItem()函式而不是mapToItem()從根呼叫它。
Component.onCompleted: {
absolute_position = root_toggle.mapFromItem(id_toggleable_item, childrenRect.x,childrenRect.y);
}
我知道它有效,但如果有人對此有解釋,所以我終于可以完全理解 QML,我仍然會感激不盡!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/513270.html
