在“StackView详解(1)”中,我们学习了StackView的基本用法,这次呢,我们来讲delegate的定制、被管理的View的生命周期、查找View等主题。
本文还会用到“StackView详解(1)”中的示例,如有需要可以回头看看。
附加属性
首先看看StackView提供的附加属性 Stack(后面会用到):
- Stack.index,index代表当前Item在StackView里的索引,从0开始哦,和StackView.depth不同哦,depth从1开始。
- Stack.status,这是一个枚举值,代表当前Item的状态。
- Stack.view,指向当前Item所属的StackView实例
我们可以在StackView管理的Item里直接访问附加属性,后面会有示例。
查找View
StackView有一个find方法:find(func, onlySearchLoadedItems)。这个方法让我们提供一个比较函数,它会对StackView管理的页面应用指定的func函数,当func返回true时,就认为找到了需要的View,find()会返回这个View。第二个参数onlySearchLoadedItems为true时,说明只查找加载到内存中的Item,为false时,则查找所有Item。
来看一个简单的例子,基于之前的例子修改的,修改的地方我做了标注。
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
Window {
title: "StackViewDemo";
width: 480;
height: 320;
visible: true;
StackView {
id: stack;
anchors.fill: parent;
/*
onBusyChanged: {
console.log("busy - " + stack.busy);
}
*/
Text {
text: "Click to create first page";
font.pointSize: 14;
font.bold: true;
color: "blue";
anchors.centerIn: parent;
MouseArea {
anchors.fill: parent;
onClicked: if(stack.depth == 0)stack.push(page);
}
}
}
Component {
id: page;
Rectangle {
color: Qt.rgba(stack.depth*0.1, stack.depth*0.2, stack.depth*0.3);
property alias text: txt.text; //property alias
Text {
id: txt; //new code
anchors.centerIn: parent;
font.pointSize: 24;
font.bold: true;
color: stack.depth <= 4 ? Qt.lighter(parent.color) : Qt.darker(parent.color);
//在onCompleted中为text属性赋值
//避免属性绑定,方便查找。
Component.onCompleted: {
text = "depth - " + stack.depth;
}
}
Button {
id: next;
anchors.right: parent.right;
anchors.bottom: parent.bottom;
anchors.margins: 8;
text: "Next";
width: 70;
height: 30;
onClicked: {
if(stack.depth < 8) stack.push(page);
}
}
Button {
id: back;