包含 QML 文件中的另一个 QML 文件
Include another QML file from a QML file
关于这个问题,Stackoverflow上还有另一个问题,但我找不到可接受的解决方案。所以我再问一次,因为老问题不被注意了。
情况是这样的。我有由"main.qml","feature1.qml","feature2.qml"定义的应用程序屏幕。
这些屏幕共享标题栏下方的同一工具栏。工具栏有多个项目,因此复制粘贴QML代码就像疯了一样。这个问题:QML文件包括 - 还是一个整体文件(结构QML代码)?说可以只使用 QML 文件名作为组件名称,但我无法让它工作。
有什么解决方案吗?
假设您有一个名为 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文件的最简单方法。
最后我从互联网上挖出来了。假设要包含的文件是这个目录结构中的"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";
}
...
}
请参阅有关可重用组件的Qt文档。
导入的 QML 文件定义一个类型,其名称与文件名相同(大写,减去 .qml 后缀)。 QML 将该类型称为可重用组件。 您可以使用该类型名称实例化导入 QML 文档(文件)中的对象。
它不像 C 语言包含,其中包含文件的文本插入到包含文件中。 它更像是在 Python 中导入类的名称,然后在导入文件中实例化该类的对象。 或者有点类似于Javascript,导入的文件正在创建一个原型对象,而导入的文件是原型继承自它。 除了注意关于根对象和组件的哪些属性将可见的讨论(因为 QML 的文档范围)。 您将无法访问导入文件中的所有内容,就好像它是 C 包含、Python 导入或 JS 继承一样。
这样很容易。将所有文件组件放在类似"组件"的文件夹中。在您的情况下,文件名可以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
}
注意文件的位置,所有组件仍应以 Caps 字母开头,在此示例中:
main.qml
componentsToolbar.qml
你可以调用 qml 的名称。例如。我有 2 个 qml 文件。main.qml 和 Merchant.qml
我刚刚打电话给商人。 它应该以智能感知显示。
ApplicationWindow {
id: mainWindow
visible: true
Component{
id: merchantsComponent
Merchant{
id: merchants
width: mainWindow.width
height: mainWindow.height
}
}
}
你可以把它称为加载器
您可以直接调用:
Window {
id: mainWindow
visible: true
Feature1{}
}
像这样,加载Feature1.qml
使用通过构建向导创建的样板 QMake 项目,我能够在添加后简单地使用其文件名从相邻的 QML 文件导入组件
import "."
导入当前目录。
我还必须添加新的 QML 文件作为资源。 在 .pro 中,我需要
resources.files =
main.qml
MyComponent.qml
resources.prefix = /$${TARGET}
RESOURCES += resources
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 根据应用程序是否已自动化显示不同的 QML 文件
- 将Qt qml文件转换为位图图像
- 如何将 QML 文件分配给主窗口/应用程序
- 我可以在 QML 文件中使用C++中的常量吗?
- 如何从另一个QML文件更改标签文本
- 一次又一次地重建以查看导入的 QML 文件更改
- QML应用程序编译一个 *form.ui.qml文件,但忽略了关联的.qml文件
- 从QT创建者中的.QML文件生成.cpp和.h文件
- 包含 QML 文件中的另一个 QML 文件
- 如何在 QML 文件中查找属性名称为字符串的 QML 上下文属性
- 在blackberry cascades 10中访问多个qml文件中的全局变量
- 如何在QML文件中调用QObject的指针
- 在QML文件中使用C++类变量
- 如何在qml文件中使用在c++文件中声明的信号
- Qt/QML:如何在不重新启动应用程序的情况下"switch to"或"open"另一个 QML 文件?
- 管理多个 qml 文件
- 将 QML 文件内容替换为另一个文件内容
- 对于几乎相似的内容,请使用qml文件
- 从C++中的QML文件加载属性