从普通的 QML Window 类生成 QtQuick UI 文件

Posted

技术标签:

【中文标题】从普通的 QML Window 类生成 QtQuick UI 文件【英文标题】:Spawn QtQuick UI file from a normal QML Window class 【发布时间】:2017-11-02 15:30:37 【问题描述】:

如何从普通 QML 窗口显示 QtQuick UI 文件集(ui.qml 和 .qml)?

要显示来自我的父 Window 类的其他 QML 窗口,调用大致是:

                var component = Qt.createComponent("SubWindow.qml")
                var window    = component.createObject(window)
                window.show()

我已经尝试调用 QtQuickUISubwindow.ui.qml 和 QtQuickUISubwindow.qml,但都不起作用。

QtQuickUI 文件不应该是子窗口吗?

【问题讨论】:

1. 为什么要用 JS 创建窗口,而用 QML 可以做到。 2. 不,QtQuickUI 文件不能将 WindowApplicationWindow 作为根元素。 (尝试手动将 .ui.qml 文件的根元素更改为 Window 并在设计器中打开以查看 Error M220)。 另见here“不支持以下功能:[...] 不是从 QQuickItem 或 Item [...] 派生的根项目” 【参考方案1】:

WindowApplicationWindow 不属于 Item(或 QQuickItem)类型。然而,这是作为.ui.qml-file 中的根项目作为stated in the documentation 放置的要求:

不支持以下功能:

[...] 不是从 QQuickItem 或 Item 派生的根项目

所以答案是:

不,您不能将 QtQuickUI 文件用作窗口或子窗口。


您可以在子窗口中轻松使用它们

// main.qml

Window 
    id: root
    width: 800
    height: 600
    visible: true
    Loader  // creates my sub window without JS
        id: winLoader
        active: false // Change to create the window.
        sourceComponent: Window 
            width: srcLoader.item ? srcLoader.item.width : 0
            height: srcLoader.item ? srcLoader.item.height : 0
            visible: srcLoader.item
            Loader 
                id: srcLoader
                source: "QtQuickUISubwindow.ui.qml" // Your ui.qml-file *here*
                active: true
            
            onClosing: winLoader.active = false
        
    
    Button 
        text: "Show sub window!"
        onClicked: winLoader.active = true
    

此代码未经我测试。等我可以访问 Qt 机器后,也许我会这样做。如何使用中继器和ListModel 初始化多个窗口,您可以在此处找到:https://***.com/a/47018205/2056452

您可以将srcLoadersource 传递给模型,如果您想打开多个不同的窗口,可以从那里读取它。


您可以修改QtQuickUISubwindow.qml 文件并添加适当大小的WindowApplicationWindow 作为根元素。然后,您可以像以前一样使用 JS 创建所有内容 - 并希望垃圾收集器运行良好。

【讨论】:

我尝试了您的 QML 代码,但无法使其正常工作,文档规范确实是正确的答案,感谢您指出。 我忘了让根窗口可见,我给ui.qml-文件起了另一个名字。现在我还添加了一个按钮,用于激活Loader

以上是关于从普通的 QML Window 类生成 QtQuick UI 文件的主要内容,如果未能解决你的问题,请参考以下文章

Java vs Qt-Qml 用于快速、流畅的 UI 设计

从 C++ 更新 QML Window 属性标志

QML 基本语法1

QML学习之浅谈Window

从物品中获取窗口

从 QML 生成 KeyEvent