错误:Qt.createQmlObject():组件未准备好

Posted

技术标签:

【中文标题】错误:Qt.createQmlObject():组件未准备好【英文标题】:Error: Qt.createQmlObject(): Component is not ready 【发布时间】:2017-02-22 12:07:40 【问题描述】:

我想使用 Qt.createQmlObject() 函数从 QML 字符串创建一个 QML 项,如 example 但第一次得到错误:“”,在第二次项目创建正确,有什么问题?

你可以看到 - 我尝试了各种项目:项目、矩形、组件(只有一个具有“状态”属性)

测试应用程序是: main.cpp:

  #include <QApplication>
  #include <QWSServer>
  #include <QDeclarativeView>

  int main(int argc, char *argv[])
  
    QApplication a(argc, argv, QApplication::GuiServer);

    QDeclarativeView view;
    view.setMinimumSize(100,100);
    view.setResizeMode(QDeclarativeView::SizeRootObjectToView);
    view.show();
    view.setSource(QUrl::fromUserInput("qrc:/createFromStringTest.qml"));

    return a.exec();
  

createFromStringTest.qml:

        import QtQuick 1.1

        Rectangle 
            id: rootRectangle
            objectName: "rootRectangle"
            anchors.centerIn: parent
            anchors.fill: parent
            color: "gray"
            border.width: 5
            border.color: "black"
            width: 50
            height: 50

            property int testCount: 0

            MouseArea 
                anchors.fill: parent
                onClicked: 
                    testCount +=1;
                    console.log("====================== Runing test "+testCount+" ======================");
                    tests()
                
            

            // what is right?
            Item
                id: parentItem
                objectName: "parentItem"
                Component.onCompleted: 
                    console.log("parentItem loaded");
                
            

            Component 
                id: parentComponent
                Item 
                    id: parentComponentItem
                    Component.onCompleted: 
                        console.log("parentComponentItem loaded");
                    
                
            

            property list<Item> parentListItem
            property list<Component> parentListComponent

            Rectangle 
                id: parentRectangle
                objectName: "parentRectangle"
                Component.onCompleted: 
                    console.log("parentRectangle loaded");
                
            

            Component.onCompleted: 
                console.log("rootRectangle loaded ");
            

            Component.onDestruction: 
                console.log("rootRectangle destroyed ");
            

            function tests()
                try
                    var newObjectparentItem = Qt.createQmlObject('import QtQuick 1.1; Rectangle objectName: "dynparentItem";anchors.centerIn: parent; anchors.fill: parent; border.width: 10; border.color: "red";',parentItem,"parentItem:");
                    console.log("parentItem OK ");
                catch(e)
                    console.log("parentItem error: "+e);
                

                try
                    var newObjectparentComponent = Qt.createQmlObject('import QtQuick 1.1; Rectangle objectName: "dynparentComponent";anchors.centerIn: parent; anchors.fill: parent; border.width: 10; border.color: "red";',parentComponent,"parentComponent:");
                    console.log("parentComponent OK ");
                catch(e)
                    console.log("parentComponent error: "+e);
                

                try
                    var newObjectparentComponentItem = Qt.createQmlObject('import QtQuick 1.1; Rectangle objectName: "dynparentComponentItem";anchors.centerIn: parent; anchors.fill: parent; border.width: 10; border.color: "red";',parentComponentItem,"parentComponentItem:");
                    console.log("parentComponentItem OK ");
                catch(e)
                    console.log("parentComponentItem error: "+e);
                

                try
                    var newObjectparentListItem = Qt.createQmlObject('import QtQuick 1.1; Rectangle objectName: "dynparentListItem";anchors.centerIn: parent; anchors.fill: parent; border.width: 10; border.color: "red";',parentListItem,"parentListItem:");
                    console.log("parentListItem OK ");
                catch(e)
                    console.log("parentListItem error: "+e);
                

                try
                    var newObjectparentListComponent = Qt.createQmlObject('import QtQuick 1.1; Rectangle objectName: "dynparentListComponent";anchors.centerIn: parent; anchors.fill: parent; border.width: 10; border.color: "red";',parentListComponent,"parentListComponent:");
                    console.log("parentListComponent OK ");
                catch(e)
                    console.log("parentListComponent error: "+e);
                

                try
                    var newObjectparentRectangle = Qt.createQmlObject('import QtQuick 1.1; Rectangle objectName: "dynparentRectangle";anchors.centerIn: parent; anchors.fill: parent; border.width: 10; border.color: "red";',parentRectangle,"parentRectangle:");
                    console.log("parentRectangle OK ");
                catch(e)
                    console.log("parentRectangle error: "+e);
                
            
        

输出:

Qml debugging is enabled. Only use this in a safe environment!
rootRectangle loaded 
parentRectangle loaded
parentItem loaded
====================== Runing test 1 ======================
parentItem error: Error: Qt.createQmlObject(): Component is not ready
parentComponent error: Error: Qt.createQmlObject(): Component is not ready
parentComponentItem error: ReferenceError: Can't find variable: parentComponentItem
parentListItem error: Error: Qt.createQmlObject(): Missing parent object
parentListComponent error: Error: Qt.createQmlObject(): Missing parent object
parentRectangle error: Error: Qt.createQmlObject(): Component is not ready
====================== Runing test 2 ======================
parentItem OK 
parentComponent OK 
parentComponentItem error: ReferenceError: Can't find variable: parentComponentItem
parentListItem error: Error: Qt.createQmlObject(): Missing parent object
parentListComponent error: Error: Qt.createQmlObject(): Missing parent object
parentRectangle OK 
rootRectangle destroyed 

使用 Qt 4.8

【问题讨论】:

检查错误信息。 @ddriver 在主题中,但是如果 parentComponent.status 始终 === 1 (Ready) 是什么意思以及如何避免错误?为什么第二次注意到错误? 【参考方案1】:

函数 Qt.createQmlObject(QML string, parent ID, filename) 的第三个参数出错 我的示例中的文件名包含“:”符号 - 没有它按预期工作!

【讨论】:

【参考方案2】:

根据我的经验,使用 Qt.createComponent + Component.createObject 动态创建对象时出现“组件未准备好”错误,并且组件中存在 QML 错误。

发现错误的一种方法是将该组件的实例静态添加到您的 QML 应用程序中,以便在运行应用程序时打印带有行号的错误。

【讨论】:

【参考方案3】:

对于像您这样的情况,请使用Qt.createComponent 动态初始化您使用的组件。初始化组件后,您可以调用 Component.CreateObject。或者您可以为此使用一个 parentComponent:parentComponent.CreateObject(QmlItem, "QML properties")。我通常使用Qt.createQmlObject 在此 QML 文件中立即使用 QML 窗口执行动态操作,并且不为其创建任何新的 QML 上下文。

请注意,在大多数情况下,您甚至不需要使用上述任何一种,而是操纵一些 QML Repeater 和它的数据模型。这样您就可以提供智能委托来自定义动态创建的项目。但这个主题远不止是您问题的答案。

【讨论】:

我需要从网络接收到的字符串创建项目。

以上是关于错误:Qt.createQmlObject():组件未准备好的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中动态创建 Popup

qml 绘制高精地图之怀疑人生的加载速度

win7组策略设置开机脚本错误怎么解决

错误:.plugins[3] 只能是二元组或三元组

WIN2008 R2 组策略出现错误

SQL Server 错误:主文件组已满