在qml中使用createComponent,但状态始终为错误。

4

当我使用Qt.createComponent动态创建组件时,状态总是Component.error,但我无法理解原因。

我的使用方式如下:

Rectangle{
    function loadTest(){
        function finishCreation() {
            if (component.status === Component.Ready) {
                console.log("ready")
            } else if (component.status === Component.Error) {
                // Error Handling
                console.log("Error loading component:", component.errorString());
            }
        }

        var component = Qt.createComponent("MyPage.qml");
        console.log(component.status)
        console.log("Error loading component:", component.errorString());
        component.statusChanged.connect(finishCreation);

        if (component.status === Component.Ready) {
            var button = component.createObject(container);
            console.log("ready")
        }
    }

    Component.onCompleted: {
        console.log("Completed Running!")
        loadTest()
    }
}

如果在qrc文件中找不到MyPage.qml,则会出现以下错误:
qrc:/MyPage.qml:-1 文件未找到"
如果我设置了MyPage.qml的完整路径,将会出现网络错误。
当我将SeriesSelectionPage.qml文件添加到资源文件中时,它可以工作。但这不应该是动态的吗?
我只想在应用程序执行时动态查找QML文件并加载它,以便应用程序可以根据用户操作加载不同的QML。
有人知道如何做到这一点吗?我快疯了。
1个回答

5

Qt.createComponent()的第一个参数是url。根据url文档:

url类型是指资源定位符(例如文件名)。它可以是绝对的,例如 "http://qt-project.org",也可以是相对的,例如 "pics/logo.png"。相对URL相对于包含组件的URL进行解析。

因此,只要您在从QRC文件加载的文件中使用相对URL,您将需要使用qrc方案:

var component = Qt.createComponent("qrc:/MyPage.qml");

2
我原本以为 OP 希望最终用户能够选择一个 QML 文件…… 我猜我看错了。 - Mitch
1
不,我想你是对的,我刚才读错了问题!哈哈。 :) - Mitch
2
谢谢大家。非常抱歉我的英语不够好,无法清晰地表达。 - behtgod
如果我想创建Qt提供的组件(在我的情况下是MessageDialog),我应该使用什么URL呢?我显然不想在代码中硬编码/opt/Qt5/blabla。 - feedc0de
@DanielBrunner 你需要在自己的QML文件中包装Qt组件。 - Mitch
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接