我有以下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 QML 和 How to access dynamically/randomly loaded Repeater items in QML?
没有成功。 那么,怎么做呢?
由于
答案 0 :(得分:2)
你有多种选择。第一种是在为委托创建Component
时定义绑定:
Repeater {
id: _windows
model: instances
TestWindow {
index: model.index
leftOffset: _component.width
onMySignalToMainWindow: testConnection() <--- Here you can connect it.
}
}
另一种选择是使用onItemAdded
和onItemRemoved
- 处理程序,并将函数连接到那里(mySignalToMainWindow.connect(functionToConnect)
)和相应的disconnect
,当它被销毁时。
如果您希望连接是永久性的,我建议使用前者,如果您希望在某个时间断开连接,我建议使用后者。
如果您没有为onItemAdded/onRemoved
声明delegate
,则Repeater
处理程序尤其重要。例如,如果您使用DelegateModel
或ObjectModel
,则会发生这种情况。与那些模型一样,您无法确定,当Repeater
添加或删除对象时,对象会被实例化或销毁,您无法使用经常提到的Component.onCompleted/onDestruction
,所以我认为{{{} 1}} - 信号优越/更通用,适用于itemAdded/Removed
。