如何在QML中绑定到ListView中的委托组件的信号

Pau*_*one 7 listview signals-slots qml

假设我有一个ListView可点击的委托组件(或GridViewRepeater).这些委托组件需要在触发时发出信号以及自定义数据,这些信息可以由父项获取ListView.如何实现这种信号绑定?

例如,以下代码是我的尝试,但我不知道如何将trigger委托组件的componentTriggered信号绑定到root项目中的信号?

Item {
    id: root
    anchors.fill: parent

    signal componentTriggered(string name)

    onComponentTriggered: {
        console.log(name + ' component was triggered')
    }

    ListModel {
        id: myModel

        ListElement { name: "alpha" }
        ListElement { name: "beta" }
        ListElement { name: "gamma" }
        ListElement { name: "delta" }
    }

    ListView {
        id: myListView
        width: 100
        height: 600

        model: myModel
        delegate: TheDelegate { name: model.name }
    }
}
Run Code Online (Sandbox Code Playgroud)

访问 TheDelegate.qml

import QtQuick 2.0

Rectangle {
    id: root
    width: 100
    height: 50
    color: "steelblue"
    border.color: "white"
    border.width: 2

    property string name

    signal trigger(string name)

    Text {
        anchors.centerIn: parent
        text: model.name
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            console.log(root.name + ' clicked')
            root.trigger(root.name)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Tar*_*rod 7

您可以在Component.onCompleted处理程序中连接两个信号.

使用您的代码将是这样的:

ListView {
        id: myListView
        width: 100
        height: 600

        model: myModel
        delegate: TheDelegate {
            name: model.name
            Component.onCompleted: {
                trigger.connect(root.componentTriggered)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

componentTriggered您也可以实现一个功能,而不是调用信号,但这取决于您的要求.无论如何,信号都可以.

  • 这真是太棒了。谢谢你。我没有意识到你可以在实例化或分配它的过程中扩展一个组件。 (2认同)