2016-10-13 2 views
0

Ich möchte ein QML-Element aus einer QML-Zeichenfolge mit der Funktion Qt.createQmlObject() wie in example erstellen, aber zum ersten Mal erhalten Sie den Fehler: "Fehler: Qt.createQmlObject(): Komponente ist nicht bereit ", was ist falsch, wenn das zweite Mal korrekt erstellt wurde?Fehler: Qt.createQmlObject(): Komponente ist nicht bereit

Sie sehen - ich war verschiedene Artikel versuchen: Item, Rechteck, Komponente (dass nur ein "Status" Eigenschaft hat)

Testanwendung ist: 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); 
       } 
      } 
     } 

Ausgang:

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 

Gebrauchte Qt 4.8

+0

Überprüfen Sie die Fehlermeldung. – dtech

+0

@ddriver es im Betreff, aber was ist gemein und wie Fehler zu vermeiden, wenn parentComponent.status immer === 1 (Ready)? Warum beim zweiten Mal Fehler festgestellt? –

Antwort

0

Fehler im dritten Argument der Funktion Qt.createQmlObject (QML-String, Eltern-ID, Dateiname) Der Dateiname in meinem Beispiel besteht aus dem ":" - Symbol - ohne dass es wie erwartet funktioniert!

0

Für den Fall, wie das Ihre Qt.createComponent verwenden, um dynamisch die Komponente, die Sie verwenden, zu initialisieren. Bei initialisierter Komponente können Sie dann Component.CreateObject anrufen. Oder Sie hätten eine Elternkomponente verwenden können: parentComponent.CreateObject(QmlItem, "QML properties"). Normalerweise verwende ich Qt.createQmlObject, um dynamische Dinge mit dem QML-Fenster sofort in dieser QML-Datei zu tun und erstelle keinen neuen QML-Kontext dafür.

Denken Sie daran, dass Sie in den meisten Fällen nicht einmal eines der oben genannten verwenden müssen, sondern einige QML Repeater und das Datenmodell dafür manipulieren. Auf diese Weise können Sie Smart Delegate bereitstellen, um dynamisch erstellte Elemente anzupassen. Aber dieses Thema ist viel mehr als die Antwort auf Ihre Frage.

+0

Ich brauche ein Element aus einer Zeichenfolge, die vom Netzwerk empfangen wurde. –

Verwandte Themen