打开和关闭其他窗口(QML)

时间:2017-10-30 14:33:33

标签: qt qml qtquick2 qtquickcontrols2

目前,我有一个以下列方式打开的窗口:

property variant win
Button {
    id: testButton
    MouseArea {
        onClicked: {
            var component = Qt.createComponent("test.qml");
            win = component.createObject(testButton);
            win.show();
        }
    }
}
  1. 是否可以创建这样的窗口,或者有更好的方法(从QML开始,而不是从C ++开始)?

  2. 当我关闭这个附加窗口时(只需单击“x”按钮),我想将它连接到另一个事件(例如,更改按钮的颜色)。怎么做?

  3. 感谢。

1 个答案:

答案 0 :(得分:3)

让它更具说明性通常更好。如果您希望按钮只打开一个窗口,Loader的使用可能适合您 我认为这是您想要的,因为您将它存储在一个变量中,如果您多次单击该按钮,您将无法访问您的实例。如果您需要使用相同Windows创建的大量Button,则可以使用ListModelInstantiator来创建实例。

使用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();
}