我在QML ApplicationWindow中有一个GridView,其中应填充一些项。
我使用JS函数“ placeItems”放置商品。但是问题是,当调用ApplicationWindow的Component.onCreated信号时,尚未布局GridView。例如,在ApplicationWindow的Component.onCreated中,GridView的x坐标等于-425。如果我稍后再调用同一函数-一切正常,并且GridView具有正确的坐标(= 75)。
我已经来回检查了Qt参考,还没有发现其他有用的信号(例如onLayouted或onLayoutComplete)。问题是何时调用“ placeItems”,以便ApplicationWindow中的GridView已经具有正确的坐标?
UPDATE1:要观察不良行为,只需在应用程序启动后单击File-> Start。它将把物品放置在正确的位置。
import QtQuick 2.2
import QtQuick.Window 2.1
import QtQuick.Controls 1.1
ApplicationWindow {
id: mainWindow
width:1000
height: 900
color : "white"
visible: true
flags: Qt.Window
function max (a,b) { return a>b ? a : b; }
function min (a,b) { return a<b ? a : b; }
property int sizeMin: width < height ? width : height
property int dimField: sizeMin - 50
property int dimCellSpacing: 3
property int dimCell: (dimField / 5 ) - 1 - dimCellSpacing
GridView {
id: field
anchors.centerIn: parent
model: 20
width: dimField
height: dimField
cellWidth: dimCell
cellHeight: dimCell
delegate: cell
property var items: []
function centerCell(column,row) {
return {x: field.x + (column + 0.5) * cellWidth,
y: field.y + (row + 0.5) * cellHeight}
}
function placeItem(name, col, row) {
var c = centerCell(col,row)
items[name].centerX = c.x
items[name].centerY = c.y
}
function placeItems() {
placeItem ("a", 3, 3)
//placeItem ("b", 4, 4)
}
}
Component.onCompleted: field.placeItems()
Component {
id: cell
Rectangle {
id: rectCell
width: dimCell
height: dimCell
color: "lightgray"
border.width: 3
border.color: "brown"
}
}
Rectangle
{
id: rectItemA
property int dimItem: 100
property int centerX: 0
property int centerY: 0
property int margin: 5
property var cell: field.items["a"] = this
border.color: "black"
border.width: 3
width: dimItem
height: dimItem
x: centerX - width/2
y: centerY - height/2
color: "red"
opacity: 0.5
}
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Start")
onTriggered: field.placeItems();
}
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
}
function placeItem(name, col, row) {
items[name].anchors.horizontalCenter = field.left;
items[name].anchors.verticalCenter = field.top;
items[name].anchors.horizontalCenterOffset = (col + 0.5) * cellWidth;
items[name].anchors.verticalCenterOffset = (row + 0.5) * cellHeight;
}
关键是将元素锚定在网格视图中,然后根据您的计算将其移动。
顺便说一句,您知道QML内置了功能Math.min
/Math.max
吗?
编辑
还是更好,为什么不直接在rectItemA中定义绑定?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句