더 선언적으로 사용하는 것이 일반적으로 더 좋습니다. 버튼 하나로 하나의 창만 열리려면 Loader
을 사용하는 것이 좋습니다.
하나의 변수에 저장하면 원하는대로 생각하고 버튼을 여러 번 클릭하면 인스턴스에 액세스 할 수 없게됩니다. 동일한 Button
으로 생성 된 더 많은 양의 Windows
이 필요한 경우 ListModel
및 Instantiator
을 사용하여 인스턴스를 만들 수 있습니다. Loader
와
이 다음과 같습니다이 코드에서
Button {
id: ldbutton
onClicked: winld.active = true
Rectangle {
id: ldindic
anchors {
left: parent.left
top: parent.top
bottom: parent.bottom
}
width: height
color: winld.active ? 'green' : 'red'
}
Loader {
id: winld
active: false
sourceComponent: Window {
width: 100
height: 100
color: 'green'
visible: true
onClosing: winld.active = false
}
}
}
이미도 두 번째 질문에 대한 대답입니다 : 당신이 closing
라고 찾고있는 신호는 - 어떤 사상을 할에 연결 필수적이다.
Loader
의 경우 창을 언로드해야하므로 나중에 다시로드 할 수 있습니다. Instantiator
으로 창을 만든 경우 Instantiator
의 ListModel
에서 해당 색인을 제거해야합니다.
이는 다음과 같습니다 당신이 연결할 수있는 코드에서
Button {
id: rpbutton
onClicked: rpmodel.append({})
text: 'Open Windows ' + rpmodel.count
ListModel {
id: rpmodel
}
Instantiator { // from QtQml 2.0
model: rpmodel
delegate: Window {
width: 100
height: 100
color: 'blue'
visible: true
onClosing: rpmodel.remove(index)
}
}
}
, 중 재산 win
, 또는 그렇게처럼 JS onClicked
을 변경하여 연결하는 Connection
-object를 사용하여 :
onClicked: {
var component = Qt.createComponent("test.qml");
win = component.createObject(testButton);
win.closing.connect(function() { console.log('do something') })
win.show();
}
부작용 : 데이터 유형 'variant'는 더 이상 사용되지 않습니다. 대신에'var'을 사용하십시오. 'Window'를 채우는 대신'property Window win'을 대신 사용하십시오. 참조 : http://doc.qt.io/qt-5/qml-variant.html – derM