访问 ListView 的属性

Accessing Attributes of a ListView

我正在编写一个加载和显示图像的 QML 应用程序,我有一个显示用户当前正在查看的图像的中央框架以及一个允许用户 select 图像的边栏。我遇到的问题是获取有关当前 selected 项目在边栏 (ListView) 中的信息。

此外,我无法访问 delegateListViewsourceChanged 信号,因此如果用户不向下滚动并然后备份以强制他们重新加载。有什么简单的方法可以访问这些属性,即使它们嵌套在 ListView?

这是我的 ListView 的代码。问题是我希望能够从 ListView 外部访问 Image 以发送 sourceChanged 信号,但我不确定您将如何访问特定项目在列表中。

//The list of frames that have been loaded
ListView {
    id: frameList
    anchors {top: parent.top; bottom: parent.bottom; left: frameViewer.right; leftMargin: 5; topMargin: 5}
    spacing: 5
    width:300
    height: parent.height

    Component {
        id: frameDelegate

        Rectangle {
            id: wrapper
            anchors {horizontalCenter: parent.horizontalCenter}
            height: 300
            width: 300
            //If there is an image in that space and if it's selected, highlight it
            color: frames[number] === undefined ? "white" : wrapper.ListView.view.currentIndex === index ? "yellow" : "white"
            Image {
                id: image
                height: 280
                width: 280
                anchors.centerIn: parent
                fillMode: Image.PreserveAspectFit
                source: "image://images/" + frames[number]
            }

            MouseArea {
                height: 280
                width: 280
                anchors.fill: image
                hoverEnabled: true
                onClicked: frames[index] === undefined ? console.log(""): wrapper.ListView.view.currentIndex = index
            }
        }
    }

    ListModel {
        id: frameModel
        ListElement {
            number: 0
        }
        ListElement {
            number: 1
        }
        ListElement {
            number: 2
        }
        ListElement {
            number: 3
        }
        ListElement {
            number: 4
        }
        ListElement {
            number: 5
        }
    }

    model: frameModel
    delegate: frameDelegate
    focus: true
}

好的,所以我解决了这个问题,尽管我可能没有以最好的方式解决它。

我的解决方案是在 window 中创建一个信号 newFrame,每次加载新帧时都会发送该信号。然后我在 Image 中使用 Connections 来更新 source,每次发送该信号时。

signal newFrame()

//Stores all the fileURLs
function loadImages()
{
    for(var i = 0; i < fileDialog.fileUrls.length; i++)
    {
        var exists = false
        for(var j = 0; j < frames.length; j++)
        {
            if(frames[j] === fileDialog.fileUrls[i])
            {
                exists = true
            }
        }
        if(exists == false)
        {
            if(frames == [])
            {
                frames = fileDialog.fileUrls[i]
            }
            else
            {
               frames.push(fileDialog.fileUrls[i])
            }
            frame.sourceChanged(frame.source)
            newFrame()

        }
    }

}

Component
{
    id: frameDelegate
    Rectangle
    {
        id: wrapper
        anchors {horizontalCenter: parent.horizontalCenter}
        height: 300
        width: 300
        //If there is an image in that space and if it's selected, highlight it
        color: frames[number] === undefined ? "white" : wrapper.ListView.view.currentIndex === index ? "yellow" : "white"
        Image
        {
            id: image
            height: 280
            width: 280
            anchors.centerIn: parent
            fillMode: Image.PreserveAspectFit
            source: "image://images/" + frames[number]
            Connections {
                target: window
                onNewFrame: {
                    image.source = "image://images/" + frames[number]
                }
            }
        }

        MouseArea
        {
            height: 280
            width: 280
            anchors.fill: image
            hoverEnabled: true
            onClicked: {frames[index] === undefined ? console.log(""): wrapper.ListView.view.currentIndex = index; frame.sourceChanged(frame.source)}
        }
    }
}