如何在QML中创建新窗口?

opa*_*tut 14 window qobject qml

有没有办法创建一个全新的窗口实例,作为QmlApplication中主QML窗口的子窗口?

// ChildWindow.qml
Rectangle {
    id: childWindow
    width: 100
    height: 100
    // stuff
}

// main.qml
Rectangle {
    id: window
    width: 1000
    height: 600

    MouseArea {
        anchors.fill: parent
        onClicked: createAWindow(childWindow);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图避免编写一个Q_OBJECT类只是为了在新的内部实现新窗口QmlApplicationViewer.

Kkn*_*knd 31

您可以使用Qt.createComponent来完成.示例(使用Qt 5.3):

main.qml

import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow {
    id: root
    width: 200; height: 200
    visible: true

    Button {
        anchors.centerIn: parent
        text: qsTr("Click me")

        onClicked: {
            var component = Qt.createComponent("Child.qml")
            var window    = component.createObject(root)
            window.show()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Child.qml

import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow {
    id: root
    width: 100; height: 100

    Text {
        anchors.centerIn: parent
        text: qsTr("Hello World.")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 错误“根未定义”是因为它没有被引用。这种方式应该有效:`var window = component.createObject("root")` (3认同)
  • @User:“root 未定义”听起来像是您忘记将 `id: root` 添加到 **main.qml** 文件中的 `ApplicationWindow` ......另外,为什么不尝试导入较新的 *QtQuick。控制*?很可能这不会破坏任何东西,只会改善小事情...... (2认同)
  • @MohammadKanan 这绝对是错误的。请阅读有关您使用的框架的文档,而不是猜测可能需要什么。传递给createObject的参数是[创建的组件的父组件](https://doc.qt.io/qt-5/qml-qtqml-component.html#createObject-method)。您可以省略它,但是您必须保留对该对象的引用,否则它将被销毁。在那里传递字符串没有任何意义。 (2认同)
  • 不,您说过应该引用 ID,这是[不正确](https://doc.qt.io/qt-5/qtqml-javascript-dynamicobjectcreation.html#creating-a-component-dynamically)。该方法需要 QtObject 作为参数,并且 AFAIK 字符串不是 QtObject。因此,这是未定义的行为。我认为它有效是因为它忽略了您的无效参数并且只是假设没有父级,但我没有查看相关代码,所以这只是一个猜测。 (2认同)

sep*_*p2k 2

仅使用内置 QML 功能无法创建顶级窗口。

然而,Qt Labs 上有一个名为Desktop Components 的项目,其中包含一个Window 组件,它允许您创建新的顶级窗口。