在我的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)中实现它,如果可能的话没有任何javascript。我不知道如何链接所有对话框和main.qml,所以我可以添加main.qml中的函数。任何帮助都会很棒!
答案 0 :(得分:1)
假设您有一个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(); }
}
让我们解释一下细节:
SimpleDialog
和openSimpleDialog
函数中动态加载/卸载closeSimpleDialog
。 getSimpleDialogInfo
所有需求。 SimpleDialog
can be caught的信号,将Connections.target设置为Loader.item。答案 1 :(得分:1)
虽然您可以在main.qml
文件中定义所有对话框和主窗口,但我强烈反对这种做法。随着对话框和主窗口的复杂性增加(它们肯定会变得更复杂),您的QML代码将变得越来越难以理解。
否则
Qt.createComponent("addMenuAppDialog.qml").createObject(rootWindow, {})
涉及从HDD加载QML文件,因此我建议不要在每次点击鼠标时调用它。我建议采用这种方法的两种替代方案。
备选方案1
为主窗口中的每个对话框创建一个组件:
Component {
id: dialog1Component
Dialog1 {}
}
然后您可以通过致电dialog1Component.createObject(rootWindow, {})
来创建它,并且当它关闭时您仍然需要手动destroy
它。
备选方案2
这是我的应用程序用于显示对话框的方法。
以声明方式创建对话框(将其放在主窗口中):
MainWindow {
Dialog1 {
id: dialog1
}
}
然后,您可以通过致电dialog1.open()
来展示它,并通过致电dialog1.close()
来隐藏它。