Как передать "это" из элемента QML в функцию JS

аналогично this ключевое слово в C++ я хотел бы либо иметь элемент 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
    }

затем, в некотором элементе.в QML:

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

в этом случае *whatGoesHere* будет экземпляром SomeElement, из которого они вызываются.

возможно ли это в В QML? Я бы подумал id свойство имело бы смысл, но, согласно документам, вы не можете запросить значение id поле, и в любом случае id не будет доступен, если мой SomeElement был описан в отдельном файле, а whatGoesHere работа над появилась в отдельном файле, а не в конкретном случае.

3 ответов


у меня есть два дополнительных предложения :

во-первых, для одного использования передайте идентификатор, поскольку это в основном указатель на элемент:

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

тогда, если вам нужно несколько элементов для совместного использования этого поведения, это означает, что вы используете MVC, поэтому ID будет работать точно так же:

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

это классическая часть.

но для todo еще лучше, если вы создаете свои собственные компоненты, имейте в виду, чтобы создать свойство "self" helper, которое выполняет " эту " работу правильно :

MouseArea { // component root definition
    id: base;

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

тогда используйте его так:

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

использовать это так часто, как вы хотите !


экземпляр SomeElement является его id значение свойства, т. е. theChild. Вы можете использовать его как this. Насколько я могу судить, другого встроенного способа не существует. Но вы можете попытаться добавить свою собственную иерархию элементов QML со свойством, которое вернет this.

другой способ-получить детей от какого-то родителя и использовать их. Таким образом, вы получаете детей, найдите ребенка, который вам нужен, и используйте этот конкретный экземпляр


Если вы определяете свой элемент в отдельном файле, то вы можете просто назначить id и использовать его. Он будет действителен только в контексте этого экземпляра:

SomeElement.в QML

Rectangle{
   id: thisElement
   MouseArea {
        anchors.fill: parent
        onClicked: {
            someJsFunction(thisElement);
            parent.theElement = thisElement;
        }
   }
}