8

与 C++中的关键字类似this,我希望有一个 QML 元素将自己传递给 JS 函数,或者让它在另一个元素上为自己设置一个属性。这可能吗?

例如:

Rectangle{
id:theParent

property var theElement

SomeElement{
id:theChild
   MouseArea {
        anchors.fill:parent
        onClicked: {
            someJsFunction(*whatGoesHere*)
            parent.theElement=*whatGoesHere*
        }
    }

或者,考虑一下:

Rectangle{
id:theParent

property var theElement

SomeElement{
id:theChild
    }

然后,在 SomeElement.qml 中:

Rectangle{
   MouseArea {
        anchors.fill:parent
        onClicked: {
            someJsFunction(*whatGoesHere*)
            parent.theElement=*whatGoesHere*
        }
}
}

在这种情况下,*whatGoesHere*将是 SomeElement 的实例,从中调用它们。

这在 QML 中可能吗?我认为该id属性是有意义的,但是根据文档,您无法查询该id字段的值,并且无论如何,id如果我SomeElement在单独的文件中进行了描述,并且上面的whatGoesHere处理出现在该单独的文件中,则该属性将不可用文件而不是在特定情况下。

4

3 回答 3

11

我有两个互补的建议:

首先,对于单一用途,传递 ID,因为它基本上是指向 item 的指针:

MouseArea {
    id: myClicker;
    onClicked: { callFunc (myClicker); }
}

然后,如果您需要多个项目来共享此行为,这意味着您正在使用 MVC,因此 ID 将完全相同:

Repeater {
    model: 100;
    delegate: MouseArea {
         id: myClicker;
         onClicked: { callFunc (myClicker); }
    }
}

那是经典的部分。

但是,如果您创建自己的组件,要做得更好,请记住创建一个“自我”辅助属性来正确完成“这个”工作:

MouseArea { // component root definition
    id: base;

    property var self : base; // bind self on the I
}

然后像这样使用它:

Repeater {
    model: 100;
    delegate: MyComponent {
         onClicked: { callFunc (self); }
    }
}

随心所欲地使用它!

于 2013-11-12T19:46:22.457 回答
0

你的实例SomeElement是它的id属性值,即theChild。您可以将其用作this. 据我所知,不存在其他内置方式。但是您可以尝试使用将返回的属性添加您自己的 QML 项目层次结构this

另一种方法是获取某个父母的孩子并使用它们。所以你得到孩子,找到你需要的孩子并使用那个特定的实例

于 2013-11-05T06:40:28.480 回答
0

如果你在一个单独的文件中定义你的元素,那么你可以简单地分配一个id并使用它。它将仅在该实例的上下文中有效:

SomeElement.qml

Rectangle{
   id: thisElement
   MouseArea {
        anchors.fill: parent
        onClicked: {
            someJsFunction(thisElement);
            parent.theElement = thisElement;
        }
   }
}
于 2013-11-06T18:06:10.333 回答