我有两个QML文件。PageOne.qml 和 PageTwo.qml. 我想从PageTwo.qml访问PageOne.qml中的元素属性和方法,从PageOne.qml访问PageTwo.qml中的元素属性和方法。 我可以从PageTwo.qml访问PageOne.qml,方法是包括
PageOne{
id: pageOne
}
在PageTwo.qml中。小菜一碟。
但是如果我添加
PageTwo{
id: pageTwo
}
到 PageOne.qml 以实现我的主要目标,我的应用程序无法启动。我没有收到任何错误。 正确的方法是什么?
只需将逻辑移动到js
文件,并将其包含在两个 qml 文件中即可。
例如,您可以创建 MyLogic.js其中包含以下内容:
.pragma library
function myPrettyComplexFunction(...)
{
...
}
稍后在您的 qml 文件中,您将像这样包含和使用它:
import "MyLogic.js" as MyLogic
...
MyLogic.myPrettyComplexFunction(...)
...
好吧,我在PageTwo.qml中声明了一个函数
PageOne{
id: pageOne
function myfunc(arg){
idOfAnElementInPageTwo.func(arg)
}
然后我从PageOne.qml调用了这个函数,它起作用了!所以我需要显式定义方法来更改/调用另一个文件中的方法。
我在搜索不相关的问题时偶然发现了您的问题, 虽然在这一点上可能与你无关,但我决定回答 因为我自己研究过类似的问题
无限传承
将PageTwo.qml
定义为PageOne {...}
类似于C++中的继承:
class PageTwo: public PageOne {...};
显然,你不能既从PageTwo
继承PageOne
,又从PageOne
继承PageTwo
,因为PageOne
会包含无限包含PageOne
PageTwo
......
但是让我们假设PageTwo
继承PageOne
- 这对您的情况应该没问题
转发引用
您无法通过其他 QML 文件中的元素id
访问元素 - 这是故意的 所有非根元素都类似于private
C++成员
不幸的是,QML不允许protected
成员或friend
类
但是您可以公开内部元素,使它们"公开"。 为此,您必须在 QML 文件的根元素中提供property alias
,如下所示:
PageOne.qml:
Column {
Text { id: pageOnePrivateElement; text: "test" }
property alias pageOnePublicElement: pageOnePrivateElement
}
PageTwo.qml
PageOne {
Text { text: pageOnePublicElement.text } //works
Text { text: pageOnePrivateElement.text } //doesn't work
}
然后你需要做Window { PageTwo{} }
-PageOne
将自动加载
向后引用
这有效,但不允许PageTwo
中的 ID 在PageOne
为此,您只需创建和分配属性:
PageOne.qml:
Column {
property Text pageTwoPublicElement
Text { text: pageTwoPublicElement.text } //works
Text { text: pageTwoPrivateElement.text } //doesn't work
}
PageTwo.qml
PageOne {
Text { id: pageTwoPrivateElement; text: "test" }
pageTwoPublicElement: pageTwoPrivateElement
}
Caveat emptor
请注意,pageTwoPublicElement
可能会在短时间内null
或undefined
PageTwo.qml
直到完全加载。
这可能会导致尝试访问对象的属性时出错undefined
即使对象已非常明确地定义也是如此。
如果遇到此类问题,您可能需要在使用前检查元素:
Text { text: ( null !== pageTwoPublicElement
&& undefined !== pageTwoPublicElement )
? pageTwoPublicElement.text : "" }
如果你不小心,你最终可能会得到binding loop
- 一个依赖于依赖于同一属性的东西的属性,也许是间接的。 此类错误通常通过注释掉代码来诊断,直到错误消息消失。