如何在QML中创建一个新窗口?

22

是否有一种方法可以创建一个全新的窗口实例,并将其作为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);
    }
}

我试图避免为了在新的QmlApplicationViewer中实例化新窗口而编写一个Q_OBJECT类。

2个回答

48
你可以使用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()
        }
    }
}

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.")
    }
}

1
在主函数中,当我点击“点击我”按钮时,出现了这个错误:“qrc:///main.qml:59: ReferenceError: root is not defined”。 - User
2
@User: "root is not defined" 听起来你忘记在 main.qml 文件的 ApplicationWindow 中添加 id: root 了。另外,为什么不尝试导入更新的 QtQuick.Controls?很可能这不会破坏任何东西,但可以改善小细节... - mozzbozz
3
“root未定义”错误是因为它没有使用引号。以下方法应该有效:var window = component.createObject("root") - Mohammad Kanan
2
@MohammadKanan,那是完全错误的。请阅读您使用的框架的文档,而不是猜测可能需要什么。传递给createObject的参数是创建组件的父级。您可以省略它,但是然后您必须保留对对象的引用,否则它将被销毁。在那里传递字符串没有任何意义。 - Stefan Fabian
2
不,你说ID应该加引号,这是错误的。该方法期望一个QtObject作为参数,而据我所知,字符串不是QtObject。因此,这是未定义的行为。我猜它能工作是因为它忽略了你的无效参数,并假定没有父对象,但我还没有查看相关代码,所以这只是一个猜测。 - Stefan Fabian
显示剩余3条评论

2

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

但是,在Qt实验室中有一个名为“桌面组件”的项目,其中包含一个“Window组件”,可以让您创建新的顶级窗口。请访问Desktop ComponentsWindow component了解更多信息。


看起来很棒,谢谢你。我的下一步本来是搜索这些桌面组件,因为我无论如何都需要它们。没想到它们还会打开新窗口 ;) - opatut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接