[英]Implement functionality of multiple windows in same file?
在我的Qt Quick(Qt v5.4和QtQuick 2.4)项目中,我具有以下五个.qml
文件:
问:我当前用于实现功能的设置正确吗? 还是应该在同一个文件中实现所有这些东西?
所有这些qml文件都是在不同的时间,通过不同的按钮单击创建和销毁的。 我正在使用这种方法打开一个对话框
`addMenuArea.onClicked: {
Qt.createComponent("addMenuAppDialog.qml").createObject(rootWindow, {});
}`
并销毁对话框:
MouseArea{
anchors.fill: parent
onClicked: {
dialogComponent.destroy()
}
}
现在,这些对话框目前没有任何功能,例如主窗口,如果可能的话,我想在一个文件(main.qml)中完全实现所有功能。 我不知道如何链接所有对话框和main.qml,因此可以在main.qml中添加功能。 任何帮助都会很棒!
假设您有一个SimpleDialog.qml
文件:
Window { //or Item, Rectangle, ... whatever
signal userPressedSomething()
property string userNameString
function textEditText(){ /*return textEdit.text()*/ }
//...
}
并假设您的main.qml
具有以下试图处理必要程序逻辑的函数:
openSimpleDialog()
加载SimpleDialog
closeSimpleDialog()
关闭SimpleDialog
userPressedSomethingInSimpleDialog()
getSimpleDialogInfo()
您可以使用Loader
加载,卸载,从对话框中获取数据,以及使用Connections
捕获信号。 这是main.qml
一个简单示例:
Loader { id: simpleDialogLoader }
function openSimpleDialog() { simpleDialogLoader.source = "SimpleDialog.qml"; }
function closeSimpleDialog() { simpleDialogLoader.source = ""; }
function getSimpleDialogInfo() {
if (simpleDialogLoader.source !== "SimpleDialog.qml") { return; }
console.log(simpleDialogLoader.item.userNameString); //property
console.log(simpleDialogLoader.item.textEditText()); //function
}
Connections {
target: simpleDialogLoader //to Loader
onUserPressedSomething: { userPressedSomethingInSimpleDialog(); }
}
让我们解释一下细节:
openSimpleDialog
和closeSimpleDialog
函数中动态加载/卸载SimpleDialog
。 getSimpleDialogInfo
需要。 SimpleDialog
信号。 尽管您可以在main.qml
文件中定义所有对话框和主窗口,但我强烈建议不要使用此方法。 随着对话框和主窗口的复杂性增加(它们肯定会变得更加复杂),您的QML代码将变得越来越难理解。
在做
Qt.createComponent("addMenuAppDialog.qml").createObject(rootWindow, {})
涉及从HDD加载QML文件,因此我不建议您在每次单击鼠标时都调用它。 我建议使用2种替代方法。
选择1
为主窗口内的每个对话框创建一个组件:
Component {
id: dialog1Component
Dialog1 {}
}
然后,您可以通过调用dialog1Component.createObject(rootWindow, {})
来创建它,并且仍然需要在关闭它时手动destroy
它。
选择2
这是我的应用程序用来显示对话框的方法。
声明式创建对话框(将其放置在主窗口中):
MainWindow {
Dialog1 {
id: dialog1
}
}
然后,你就可以通过调用来显示它dialog1.open()
并通过调用来隐藏它dialog1.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.