【问题标题】:Using a Loader for a string of QML对 QML 字符串使用 Loader
【发布时间】:2014-06-07 16:09:51
【问题描述】:

在 Qt 5.3 中,我一直使用 Loader QML 元素来加载屏幕,在后台从 QML 文件加载视图。现在我正在尝试动态加载 QML 字符串Qt.createQmlObject 使我能够这样做,但我似乎无法让 Loader 元素一起玩。

似乎Loader 只接受一个 URL (QUrl) 或组件 (QQmlComponent),但 Qt.createQmlObject 创建一个对象 (QObject)。

我是 QML 新手,但据我了解,组件是可重用的元素,类似于类,而对象是这些类的实例。因此,我似乎无法理解为什么 Loader 不能处理对象。

如何在(异步)解析和初始化 QML 字符串时显示加载屏幕?

QML 代码示例:

Item {
    Rectangle {id: content}

    Loader {id: loader}

    Component.onCompleted: {
        var obj = Qt.createQmlObject('import QtQuick 2.3; Rectangle {}', content);

        loader.source = obj; // Throws error.
    }
}

【问题讨论】:

    标签: qt asynchronous qml


    【解决方案1】:

    使用当前的 API 是不可能的。正如 Loader 的文档所说,它通过指向 QML 文件或组件的 URL 加载对象:

    import QtQuick 2.0
    
    Item {
        Rectangle {
            id: content
            anchors.fill: parent
            color: "grey"
    
            Loader {
                id: loader
                sourceComponent: myComponent
                anchors.fill: parent
                anchors.margins: 40
            }
        }
    
        property Component myComponent: Qt.createComponent("MyComponent.qml", Component.Asynchronous)
    }
    

    MyComponent.qml:

    import QtQuick 2.2
    
    Rectangle {
       color: "red"
    }
    

    【讨论】:

    • 嗨 Mitch,感谢您的参与。虽然这是 Loader 加载 QML 文件的一个很好的例子,但我实际上正在寻找一种将 Loader 应用于 QML 字符串的方法.换句话说:有什么办法可以做到Qt.createComponent(QString string)而不是Qt.createComponent(QUrl url)
    • 不,这就是我的回答想要表达的意思。我已经更新了。
    • 不过,应该有一些方法可以异步加载 QML 字符串。也许我需要写一个Loader 子类。无论哪种方式,感谢您的意见米奇。
    • 不用担心。您可能还想在 bugreports.qt-project.org 上为此创建一个建议。
    • 好电话。我刚刚创建了一个:bugreports.qt-project.org/browse/QTBUG-39529
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    相关资源
    最近更新 更多