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

时间:2015-01-09 15:21:24

标签: c++ qt qml qt-quick

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

  1. MainForm.ui.qml - 其中包含应用程序的主窗口
  2. main.qml - 包含mainForm.ui.qml对象的所有功能实现,例如onClicked事件,调用c ++函数从textInputs获取值等。
  3. 问:我目前的实施功能设置是否正确?或者我应该在同一个文件中实现所有这些东西吗?

    1. dialog1.qml - 包含某些设置的一些文本输入等。
    2. dialog2.qml - 对于我的应用程序中的某些列表和表格。
    3. dialog3.qml - 还包含一些c ++函数的对象。
    4. 所有这些qml文件都是在不同的按钮点击的不同时间创建和销毁的。我正在使用此方法打开一个对话框

      `addMenuArea.onClicked: {
      Qt.createComponent("addMenuAppDialog.qml").createObject(rootWindow, {});
      }`
      

      并且用于销毁对话框:

      MouseArea{
          anchors.fill: parent
          onClicked: {
              dialogComponent.destroy()
          }
      }
      

      现在这些对话框没有任何功能,比如主窗口,我想在一个文件(main.qml)中实现它,如果可能的话没有任何javascript。我不知道如何链接所有对话框和main.qml,所以我可以添加main.qml中的函数。任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

假设您有一个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()
  5. 您可以使用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属性在SimpleDialogopenSimpleDialog函数中动态加载/卸载closeSimpleDialog
    • Loader.item保存由加载程序创建的对象,这就是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()来隐藏它。