QML与Repeater之间的信号

时间:2017-02-23 09:22:04

标签: connection qml signals repeater

我有以下qml文件,main.qml创建TestWindow.qml元素。

我想将TestWindow.qml中的信号(单击按钮mySignalToMainWindow())连接到main.qml,testConnection()中的函数。

main.qml

Window {
    id: _component

    property int instances: 3

    width: 200
    height: Screen.height / 2
    visible: true

    Component.onCompleted: {
        x = 40
        y = 40
    }

    Repeater {
        id: _windows
        model: instances
        TestWindow {
            index: model.index
            leftOffset: _component.width
        }
    }

    Column {
        Repeater {
            model: instances
            Button {
                text: "Window " + index
                onClicked:{ _windows.itemAt(index).window.raise();
                }
            }
        }
    }

    function testConnection(){console.log("Subwindow To Main Window")}
}

和TestWindow.qml:

Item {
    id: _windowItem
    property int index
    property int leftOffset
    property alias window: _window
    signal mySignalToMainWindow()

    Window {
        id: _window

        visible: true
        title: "SubWindowText " + index

        Component.onCompleted: {
            x = leftOffset
            y = 40
            width = Screen.width - leftOffset
            height = Screen.height / 2
        }

        Text {
            id: windowText
            text: qsTr("SubWindowText")
        }

        Button {
            text: "SubWindow " + index
            onClicked: {console.log("TestWindow::Button onClicked "+_window);
                _windowItem.mySignalToMainWindow();
            }
        }
    }

}

我测试了这两个:

How to bind to a signal from a delegate component within a ListView in QMLHow to access dynamically/randomly loaded Repeater items in QML?

没有成功。 那么,怎么做呢?

由于

1 个答案:

答案 0 :(得分:2)

你有多种选择。第一种是在为委托创建Component时定义绑定:

Repeater {
    id: _windows
    model: instances
    TestWindow {
        index: model.index
        leftOffset: _component.width
        onMySignalToMainWindow: testConnection() <--- Here you can connect it.
    }
}

另一种选择是使用onItemAddedonItemRemoved - 处理程序,并将函数连接到那里(mySignalToMainWindow.connect(functionToConnect))和相应的disconnect,当它被销毁时。

如果您希望连接是永久性的,我建议使用前者,如果您希望在某个时间断开连接,我建议使用后者。

如果您没有为onItemAdded/onRemoved声明delegate,则Repeater处理程序尤其重要。例如,如果您使用DelegateModelObjectModel,则会发生这种情况。与那些模型一样,您无法确定,当Repeater添加或删除对象时,对象会被实例化或销毁,您无法使用经常提到的Component.onCompleted/onDestruction,所以我认为{{{} 1}} - 信号优越/更通用,适用于itemAdded/Removed