繁体   English   中英

在同一文件中实现多个窗口的功能?

[英]Implement functionality of multiple windows in same file?

在我的Qt Quick(Qt v5.4和QtQuick 2.4)项目中,我具有以下五个.qml文件:

  1. MainForm.ui.qml-包含应用程序的主窗口
  2. main.qml-包含mainForm.ui.qml对象的所有功能实现,例如onClicked事件,调用c ++函数以从textInputs获取值等。

问:我当前用于实现功能的设置正确吗? 还是应该在同一个文件中实现所有这些东西?

  1. dialog1.qml-包含一些用于某些设置等的文本输入。
  2. dialog2.qml-对于我的应用程序中的某些列表和表格。
  3. dialog3.qml-还包含一些用于c ++函数的对象。

所有这些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具有以下试图处理必要程序逻辑的函数:

  1. openSimpleDialog()加载SimpleDialog
  2. closeSimpleDialog()关闭SimpleDialog
  3. userPressedSomethingInSimpleDialog()
  4. 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(); }
}

让我们解释一下细节:

  • 使用Loader.source属性在openSimpleDialogcloseSimpleDialog函数中动态加载/卸载SimpleDialog
  • Loader.item持有由加载程序创建的对象,而这是所有getSimpleDialogInfo需要。
  • 通过将Connections.target设置为Loader.item, 可以捕获来自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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM