2017-09-15 1 views
1

Wenn ich dies tun:Wie lautet die Semantik des Elternelements der sourceComponent eines Loaders?

Loader { 
    sourceComponent: Item { 
     id: toLoad 
    } 
} 

dann hat toLoad Eltern null wenn ich explizit ein Elternteil darauf setzen.

Aber wenn ich dies tun:

Component { 
    id: myComp 
    Item { 
    } 
} 

Loader { 
    sourceComponent: myComp 
} 

dann das Element vom Loader instanziiert hat Eltern gleich den Elternteil des Loader.

Ist diese Beschreibung experimentell vollständig und richtig bestimmt, oder muss etwas hinzugefügt werden?

Wenn es richtig ist, warum gibt es dann diesen Unterschied zwischen den beiden Fällen?

Antwort

1

Es gibt Unterstützung für die implizite Konvertierung von einer Instanz in eine Komponente.

So folgt aus:

Loader { 
    sourceComponent: Item { 
     id: toLoad 
    } 
} 

ist einfach die implizite Version davon:

Loader { 
    sourceComponent: Component { 
     Item { 
      id: toLoad 
     } 
    } 
} 

Wenn Sie auf eine Eigenschaft binden, wird der Wert von der „Eltern“ Objekt gesammelt wird, aber es ist nicht dran dran. Der Artikel ist nicht eine Instanz, sondern eine Eigenschaft und Eigenschaften nicht parented:

property Item name: Item { 
    Component.onCompleted: console.log(name.parent) \\ null 
    } 

Dies ändert sich, wenn die tatsächliche Komponente instanziert wird, und es ist sehr viel parented, wo es sein muss:

Row { 
    Loader { 
     sourceComponent: MouseArea { 
     id: toLoad 
     width: 200 
     height: 200 
     onClicked: { 
      console.log(parent) \\ QQuickLoader(0x2128768) 
      console.log(toLoad.parent) \\ QQuickLoader(0x2128768) 
     } 
     } 
    } 
    Loader { 
     sourceComponent: myComp 
    } 
    } 
    Component { 
    id: myComp 
    MouseArea { 
     width: 200 
     height: 200 
     onClicked: console.log(parent) // QQuickLoader(0x2128768) 
    } 
    } 
    Component.onCompleted: console.log(toLoad.parent) // ReferenceError: toLoad is not defined 

Wie aus diesem Code hervorgeht, können Sie nicht einmal auf eine ID zugreifen, die sich in einer Komponente außerhalb dieser Komponente befindet. Also ich weiß nicht, wo Sie dieses Null Elternteil haben, es gibt keine solche ID auf der Außenseite, und auf der Innenseite wird das Objekt instanziiert und es wird definitiv ein Elternteil haben.

Beachten Sie auch, dass die Component ist auch eine Art Sonderfall, da es nicht einmal die Eltern aussetzen, auch wenn es definitiv eine.

+0

Es sollte beachtet und unterschieden werden, dass es in Qt Quick übergeordnete und visuelle Eltern gibt. Sie unterscheiden sich oft für ein Objekt. – Orient

+0

* "Es gibt Unterstützung für die implizite Konvertierung von einer Instanz in eine Komponente." * Es gibt keine Instanz. Für jede Eigenschaft vom Typ 'Component' wird der Code in eine Komponente zerlegt. Wenn Sie die Instanz implizit in eine Komponente konvertieren würden, könnten Sie Folgendes schreiben: 'sourceComponent: Qt.createComponent (" SomeQML.qml "). CreateObject (...)', das mit "* fehlschlägt, QQuickItem kann nicht zugewiesen werden QQmlComponent * ". * "Ist einfach die implizite Version von diesem:" * ist richtig. – derM

+0

* "Beachten Sie auch, dass die Komponente auch eine Art Sonderfall ist, da sie nicht einmal den Elternteil ausstellt, auch wenn er definitiv einen hat." * => Wie ein 'QtObject' hat eine Komponente keinen visuellen Elternteil. 'Component {parent: ...}' wird fehlschlagen. Es könnte einen Elternteil im Sinne des Qt-Elternteils haben, aber keinen visuellen Elternteil, und das sind alles, was in QML zählt. Der nicht-visuelle Elternteil wird niemals belichtet. – derM

Verwandte Themen