js中未定义QML元素

QML elements undefined from js

本文关键字:元素 QML 未定义 js      更新时间:2023-09-26

我在从js文件更改元素属性时遇到问题。在我的程序中,我有这种结构的主要元素:

import "main.js" as Main
ApplicationWindow
{
    id: applicationWindow
    VK {
        id: vk
        onReplyReady: {
            if (typeof document === "string") {
                var obj = JSON.parse(document)
                console.log(typeof obj.response,typeof obj.count)
                Main.processReply(obj.response)
            } else {
                Debug.log("VK UNKNOWN ERROR")
            }
        }
    }
    initialPage: Component { Auth { } }
    cover: Qt.resolvedUrl("cover/CoverPage.qml")
}

在组件Auth中,我有一个代码:

Page {
    id: messangesPage
    Button {
        id: mycoolbutton
        text: "button"
        onClicked: {
            vk.getMessanges("lol",0)
        }
    }
    Component.onCompleted: {
        vk.getMessanges("lol",0)
    }
}

所以我的代码的想法很简单——我有vk对象,它必须是全局的。当我调用vk.getMessanges时,vk会向服务器发送请求,然后发出replyReady信号。在onReplyReady中,我只是解析来自服务器的回复并调用main.js中的函数,我想在其中执行该函数:

function processReply(reply) {
    mycoolbutton.text = "mycoolbutton"
}

然而,我得到了一个错误:

main.js:8: ReferenceError: mycoolbutton is not defined

我注意到,如果我从组件Auth调用processReply()函数,那么一切都会很好,但当我从元素applicationWindow调用时,我会出现错误。我试图在applicationWindow中添加属性别名mycolbuttonptr:mycolbutton,但我遇到了另一个错误。那样的话我该怎么办?

您知道每次导入main.js都会实例化一次吗?如果从多个QML文件导入main.js,则会获得main的多个实例,因此,如果在其中一个实例中设置对mycolbutton的引用,则该引用仅在实例上设置。

如果你只想有一个Main实例,你必须在带有的JS文件的开头声明它

.pragma library

您无法通过JS文件中的id访问Items。您应该将按钮作为参数传递,例如:

function processReply(reply, btn) {
    btn.text = "mycoolbutton"
}

".pragma库"可能会有所帮助,但并不能解决问题。