【问题标题】:How can I create a new window from within QML?如何从 QML 中创建新窗口?
【发布时间】:2012-01-09 19:17:47
【问题描述】:

有没有办法创建一个全新的窗口实例,作为 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);
    }
}

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

【问题讨论】:

    标签: window qml qobject


    【解决方案1】:

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

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

    【讨论】:

    • 在 main 内部我收到此错误“qrc:///main.qml:59: ReferenceError: root is not defined”,当我按下点击我按钮时?
    • @User: "root is not defined" 听起来你忘记在 main.qml 文件中将id: root 添加到ApplicationWindow ... 另外为什么不尝试导入较新的 QtQuick.Controls?这很可能不会破坏任何东西,只会改善一些小事情......
    • 错误“未定义根”是因为它没有被引用。这种方式应该可以工作:var window = component.createObject("root")
    • @MohammadKanan 这绝对是错误的。请阅读有关您使用的框架的文档,而不是猜测可能需要什么。传递给 createObject 的参数是the parent of the created component。您可以省略它,但是您必须保留对该对象的引用,否则它将被销毁。在那里传递一个字符串没有任何意义。
    • 不,您说应该引用 ID,即incorrect。该方法需要一个QtObject作为参数,并且AFAIK一个字符串不是一个QtObject。因此,这是未定义的行为。我认为它可以工作,因为它忽略了你的无效参数,只是假设没有父级,但我没有查看相关代码,所以这只是一个猜测。
    【解决方案2】:

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

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

    【讨论】:

    • 这看起来很棒,谢谢。我的下一步是搜索这些桌面组件,因为无论如何我都需要它们。没想到他们也会做新窗口;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多