还有关于此问题的另一个关于Stackoverflow的问题,但我找不到可接受的解决方案。所以我再问一遍,因为旧的问题没有引起人们的注意。
情况就是这样。我有由' main.qml',' feature1.qml',' feature2.qml'定义的应用程序屏幕。
这些屏幕共享标题栏下方的相同工具栏。工具栏有多个项目,因此复制粘贴QML代码就像疯了一样。这个问题:QML file include - or one monolithic file (structure QML code)?说可以将QML文件名用作组件名称,但我无法使其正常工作。
任何解决方案?详情请参阅。
答案 0 :(得分:33)
假设您有一个名为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文件的最简单方法。
答案 1 :(得分:5)
最后我从互联网上挖出来了。假设这个目录结构中的待包含文件是'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";
}
...
}
答案 2 :(得分:2)
See Qt documentation about reuseable components.
导入的QML文件定义了一个类型,其名称与文件名相同(大写,少于.qml后缀)。 QML将类型称为可重用组件。您可以使用该类型名称在导入QML文档(文件。)中实例化对象。
它不像C语言包含,其中包含文件的文本被插入到包含文件中。它更像是在Python中导入类的名称,然后在导入文件中实例化该类的对象。或者有点类似于Javascript,导入的文件正在创建原型对象,导入文件原型继承自它。除了注意关于根对象的讨论以及组件的哪些属性将是可见的(因为QML的文档范围。)您无法访问导入文件中的所有内容,就像它是C一样include,Python导入或JS继承。
答案 3 :(得分:0)
您可以调用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
答案 4 :(得分:0)
您可以直接致电:
Window {
id: mainWindow
visible: true
Feature1{}
}
像这样加载Feature1.qml
答案 5 :(得分:0)
那样很容易。将所有文件组件放入“组件”之类的文件夹中。您的文件名可以为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