【问题标题】:How to pass “this” from a QML element to a JS Function如何将“this”从 QML 元素传递给 JS 函数
【发布时间】:2013-11-05 06:12:40
【问题描述】:

类似于 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 字段的值,并且无论如何,如果我的SomeElement 在单独的文件,并且上面的 whatGoesHere 处理出现在该单独的文件中,而不是在特定实例中。

【问题讨论】:

    标签: qt qml qtquick2


    【解决方案1】:

    我有两个互补的建议:

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

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

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

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

    这是经典部分。

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

    MouseArea { // component root definition
        id: base;
    
        property var self : base; // bind self on the I
    }
    

    然后像这样使用它:

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

    随心所欲地使用它!

    【讨论】:

    • 不错的解决方案,您对用 c++ 定义并通过 qmlRegisterType() 公开的组件有什么建议吗?可以使用QObject* 键入的Q_PROPERTY 指向this 吗?
    【解决方案2】:

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

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

    【讨论】:

    • 假设我有很多 SomeElements,并且我希望在 SomeElement.qml 中定义的这个功能不像我的代码那样内联。然后 id 在 SomeElement.qml 中将不可用,因为它还不是实例。
    • 为每个SomeElement 添加名称,获取父级的子级(包含那些SomeElements)并通过名称找到您需要的内容。然后使用。很简单
    • 当然,循环访问父级的所有子级是一种方法,但我希望按照上面代码的隐含行为直接访问。但我怀疑这在 QML 中不是惯用的
    【解决方案3】:

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

    SomeElement.qml

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

    【讨论】:

    • 如果您在另一个文件中有多个 SomeElements,多个实例,每个实例都有自己的 ID。你是说onClicked 足够聪明,可以将 SomeElement.qml 文件中的thisElement 替换为另一个文件中设置的最终实例 ID?
    • 它不会替换任何东西:将两个 id 视为指向同一个对象的两个指针。
    猜你喜欢
    • 2020-10-10
    • 2016-12-11
    • 2016-07-20
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2011-07-15
    相关资源
    最近更新 更多