QML状态不起作用

时间:2013-09-18 11:41:47

标签: qt qml

好的,所以这里是QML,我想要做的是,如果一个元素是当前项目,那个盒子会变大。

import QtQuick 2.0

Rectangle {
width: 300; height: 200; color: "white"

ListModel {
    id: nameModel
    ListElement { name: "Alice"; }
    ListElement { name: "Bob";  }
    ListElement { name: "Jane"; }
    ListElement { name: "Harry";  }
    ListElement { name: "Wendy";  }
}

Component {
    id: nameDelegate
    Item {
        id: delegateItem
        width: parent.width

我试试这个:

states: [
            State {
                name: "current"
                when: ListView.isCurrentItem
                PropertyChanges { target: delegateItem; height: 44 }
            },
            State {
                name: "not"
                when: !ListView.isCurrentItem
                PropertyChanges { target: delegateItem; height: 26 }
            }]
        state: "not"

        Text {
            text: name
            font.pixelSize: parent.height - 4
            anchors.left: parent.left
            anchors.verticalCenter: parent.verticalCenter

在这里,我做了类似的事情来验证它是否有效,它确实有效:

            color: delegateItem.ListView.isCurrentItem ? "red" : "black"
        }
    }
}

ListView {
    id: listView
    anchors.fill: parent

    model: nameModel
    delegate: nameDelegate
    focus: true
    clip: true

    header: Rectangle {
        width: parent.width; height: 10;
        color: "#8080ff"
    }
    footer: Rectangle {
        width: parent.width; height: 10;
        color: "#8080ff"
    }
    highlight: Rectangle {
        width: parent.width; height: 10;
        color: "lightgray"
    }
}
}

现在我想知道出了什么问题,我知道ListView.isCurrentItem会发生变化,因为 我看到选中时字母变为红色。

See letters turn red, but box doesn't grow

修改

jbh给我的答案很好。之后我将ListView.isCurrentItem更改为delegateItem.ListView.isCurrentItem并且有效。这是因为您无法从状态访问isCurrentItem,但如果您转到delegateItem则确实有效。

1 个答案:

答案 0 :(得分:2)

我认为您的问题与Attached properties的定义直接相关。

附加媒体资源ListView.isCurrentItem仅适用于ListView的委托部分。因此它无法在外部工作,在您的情况下,在State

的定义中也无法工作