【问题标题】:Include another QML file from a QML file从 QML 文件中包含另一个 QML 文件
【发布时间】:2014-04-05 18:45:39
【问题描述】:

Stackoverflow 上还有一个关于这个问题的问题,但我找不到可以接受的解决方案。所以我再问一次,因为老问题没有引起注意。

情况是这样的。我有由“main.qml”、“feature1.qml”、“feature2.qml”定义的应用程序屏幕。

这些屏幕共享标题栏下方的相同工具栏。工具栏有多个项目,所以复制粘贴 QML 代码就像疯了一样。这个问题:QML file include - or one monolithic file (structure QML code)? 说可以只使用 QML 文件名作为组件名,但我无法让它工作。

有什么解决办法吗?请详细说明。

【问题讨论】:

  • 关于寻找问题问题的巨魔的非常可悲的声明,现在问题中的第一个声明是“看……这个问题之前已经问过,但它不够……所以得到离开我的案子……现在是真正的话题……”。

标签: c++ qt include components qml


【解决方案1】:

假设您有一个名为main.qml 的文件和另一个名为MyCustomText.qml 的文件中的组件。如果两个文件在同一个目录下,你可以像这样直接加载组件:

// in Main.qml
Rectangle {
  id: root
  MyCustomText {
    text: "This is my custom text element"
  }
}

如果MyCustomText.qml 位于另一个子目录MyComponents 中,例如要将所有自定义组件组合在一起,则首先需要import 目录,然后才能以相同的方式使用组件:

// in Main.qml
import "MyComponents"

Rectangle {
  id: root
  MyCustomText {
    text: "This is my custom text element"
  }
}

另一个需要注意的重要事项是,如果您希望能够以这种方式使用它们,您的 QML 文件应该始终以大写字母开头

当然,您的Loader 解决方案也可以,但这是在其他组件中导入 QML 文件的最简单方法。

【讨论】:

  • 我还是比较喜欢使用Loader的方案,因为是基于linux的,文件路径应该是小写的
  • @PaulDinham Linux 中没有关于文件或目录名称的情况。此外,QML 不是 C++,它是它自己的语言,我敢打赌大部分开发都是在 Linux 上完成的。您“应该”遵守语言约定。
  • 我的意思是一般的linux文件名,目录名是小写的
  • 对于 Qt 5.3,如果您在 QRC 文件中创建另一个前缀,您可以使用 import 'qrc:/anotherComponents 导入该前缀
  • 大写的东西花了我几分钟。谢谢
【解决方案2】:

我终于从网上挖出来了。假设要包含的文件是此目录结构中的“mycomponent.qml”(Qt Quick):

projectdir/
  qml/
    projectname/
      main.qml
      mycomponent.qml

'mycomponent.qml'的内容(例如):

Text {
  text:"Hello, Scooby Doo!";
}

我们必须以这种方式加载它(在 'main.qml' 中):

Rectangle {
  ...
  Loader {
    source:"mycomponent.qml";
  }
  ...
}

【讨论】:

  • 注意:如果没有实际理由使用Loader,这会使一切变得不必要地复杂化。它不应该用于您可以直接将组件名称“静态”写入 QML 的情况。
  • 有一个使用Loader的情况:qml文件在另一个目录,但是可以通过'import'来解决
【解决方案3】:

See Qt documentation about reuseable components.

导入的 QML 文件定义了一个名称与文件名相同的类型(大写,减去 .qml 后缀)。 QML 将该类型称为可重用组件。您使用该类型名称来实例化导入 QML 文档(文件)中的对象。

它不像 C 语言包含,其中包含文件的文本被插入到包含文件中。它更像是在 Python 中导入一个类的名称,然后在导入文件中实例化该类的一个对象。或者有点类似于 Javascript,导入的文件是创建一个原型对象,而导入的文件是原型继承自它。除了注意关于根对象的讨论以及组件的哪些属性将是可见的(因为 QML 的文档范围。)您将无法访问导入文件中的所有内容,就好像它是 C 包含、Python 导入、或 JS 继承。

【讨论】:

    【解决方案4】:

    您可以只调用 qml 的名称。 例如。 我有 2 个 qml 文件。 main.qml 和 Merchant.qml

    我刚打电话给商人。它应该以智能感知显示。

    ApplicationWindow {
    id: mainWindow
    visible: true
    Component{
        id: merchantsComponent
        Merchant{
            id: merchants
            width: mainWindow.width
            height: mainWindow.height
        }
    }
    

    }

    你可以把这个组件调用到 Loader

    【讨论】:

      【解决方案5】:

      您可以直接调用:

      Window {
          id: mainWindow
          visible: true
          Feature1{}
      }
      

      像这样,加载Feature1.qml

      【讨论】:

        【解决方案6】:

        就这么简单。将所有文件组件放在“组件”之类的文件夹中。在您的情况下,文件的名称可以是Toolbar.qml。为您的工具栏编写 QML 代码,我的示例将绘制一个红色矩形。

         import QtQuick 2.6
            
            Item {
                width: 500
                height: 100
                Rectangle {
                    width: 500
                    height: 100
                    color: "red"
                    radius: width * 0.5
                }
            }
        

        然后,在你想要使用这个组件的屏幕中(例如,文件main.qml),就像这样简单:

        import "components" as Components
                
               
        Components.Toolbar {
            Layout.fillHeight: true
        }
        

        注意文件的位置,在此示例中,所有组件仍应以大写字母开头:

        \main.qml
        \components\Toolbar.qml
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-01
          • 1970-01-01
          相关资源
          最近更新 更多