从一个 QML 文件访问另一个 QML 文件的属性,反之亦然



我有两个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会包含无限包含PageOnePageTwo......

但是让我们假设PageTwo继承PageOne- 这对您的情况应该没问题

转发引用

您无法通过其他 QML 文件中的元素id访问元素 - 这是故意的 所有非根元素都类似于privateC++成员

不幸的是,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可能会在短时间内nullundefinedPageTwo.qml直到完全加载。

这可能会导致尝试访问对象的属性时出错undefined即使对象已非常明确地定义也是如此。

如果遇到此类问题,您可能需要在使用前检查元素:

Text { text: ( null !== pageTwoPublicElement 
&& undefined !== pageTwoPublicElement ) 
? pageTwoPublicElement.text : "" }

如果你不小心,你最终可能会得到binding loop- 一个依赖于依赖于同一属性的东西的属性,也许是间接的。 此类错误通常通过注释掉代码来诊断,直到错误消息消失。

最新更新