错误: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():组件未准备好的主要内容,如果未能解决你的问题,请参考以下文章