从普通的 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 文件不能将Window
或 ApplicationWindow
作为根元素。 (尝试手动将 .ui.qml 文件的根元素更改为 Window
并在设计器中打开以查看 Error M220)。
另见here:“不支持以下功能:[...] 不是从 QQuickItem 或 Item [...] 派生的根项目”
【参考方案1】:
Window
和 ApplicationWindow
不属于 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
您可以将srcLoader
的source
传递给模型,如果您想打开多个不同的窗口,可以从那里读取它。
您可以修改QtQuickUISubwindow.qml
文件并添加适当大小的Window
或ApplicationWindow
作为根元素。然后,您可以像以前一样使用 JS 创建所有内容 - 并希望垃圾收集器运行良好。
【讨论】:
我尝试了您的 QML 代码,但无法使其正常工作,文档规范确实是正确的答案,感谢您指出。 我忘了让根窗口可见,我给ui.qml
-文件起了另一个名字。现在我还添加了一个按钮,用于激活Loader
。以上是关于从普通的 QML Window 类生成 QtQuick UI 文件的主要内容,如果未能解决你的问题,请参考以下文章