目前,我有一个以下列方式打开的窗口:
property variant win
Button {
id: testButton
MouseArea {
onClicked: {
var component = Qt.createComponent("test.qml");
win = component.createObject(testButton);
win.show();
}
}
}
是否可以创建这样的窗口,或者有更好的方法(从QML开始,而不是从C ++开始)?
当我关闭这个附加窗口时(只需单击“x”按钮),我想将它连接到另一个事件(例如,更改按钮的颜色)。怎么做?
感谢。
答案 0 :(得分:3)
让它更具说明性通常更好。如果您希望按钮只打开一个窗口,Loader
的使用可能适合您
我认为这是您想要的,因为您将它存储在一个变量中,如果您多次单击该按钮,您将无法访问您的实例。如果您需要使用相同Windows
创建的大量Button
,则可以使用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)
}
}
}
在您的代码中,您可以使用Connection
- 对象连接到您的属性win
,或者通过更改JS onClicked
来连接到它:
onClicked: {
var component = Qt.createComponent("test.qml");
win = component.createObject(testButton);
win.closing.connect(function() { console.log('do something') })
win.show();
}