2013-08-09 17 views
5

Ho un contenitore che viene riempito con componenti creati dinamicamente durante il runtime. Ognuno di questi elementi (chiamiamoli DynamicObject s) ha un albero di sottoelementi (Node s), anch'esso creato dinamicamente. Inoltre, i componenti Node possono essere annidati l'uno dentro l'altro (come una struttura ad albero).QML - indirizzamento a un antenato

Lasciate che il contenitore ha il parametro id impostato su "main_container" ed ogni DynamicObject averla impostata "dynamic_object".

Ogni volta che provo ad indirizzare lo main_container da uno qualsiasi degli elementi nidificati Node, tutto funziona correttamente. Il problema si verifica quando provo ad indirizzare lo dynamic_object da qualsiasi Node diverso da quello principale (quello che è il discendente diretto/figlio di dynamic_object). Essa si traduce in:

ReferenceError: dynamic_object is not defined

La mia domanda è: quello che potrebbe essere la causa alla base di questo comportamento? Può avere qualcosa a che fare con il fatto che questi oggetti sono creati dinamicamente? (questo è stato il mio primo pensiero dal momento che posso sempre indirizzare lo main_container ed è staticamente dichiarato nel codice qml).

Esempio di codice: (se c'è qualcosa che manca per favore fatemelo ora nei commenti)

// Container.qml 

import "container_logic.js" as Logic 

Rectangle { 
    id: main_container 

    Keys.onTabPressed: { 
    Logic.createComponent("DynamicObject.qml", {/* some parameters */}); 
    var dynamic_object = Logic.object; 

    Logic.createComponent("Node.qml",{labelText: "asdefg"}, undefined, dynamic_object) 
    var asdefg = Logic.object; 
    Logic.createComponent("Node.qml",{labelText: "tree A"}, undefined, dynamic_object) 
    var tree_a = Logic.object; 

    Logic.createComponent("Node.qml",{labelText: "a"}, undefined, asdefg) 
    var a = Logic.object; 
    Logic.createComponent("Node.qml",{labelText: "s"}, undefined, asdefg) 
    var s = Logic.object; 

    asdefg.subnodes = [a, s] 

    Logic.createComponent("Node.qml",{labelText: "tree B", isInput: false}, undefined, dynamic_object) 
    var tree_b = Logic.object; 
    Logic.createComponent("Node.qml",{labelText: "xyz", isInput: false}, undefined, dynamic_object) 
    var xyz = Logic.object; 

    Logic.createComponent("Node.qml",{labelText: "x", isInput: false}, undefined, xyz) 
    var x = Logic.object; 
    Logic.createComponent("Node.qml",{labelText: "y", isInput: false}, undefined, xyz) 
    var y = Logic.object; 
    Logic.createComponent("Node.qml",{labelText: "z", isInput: false}, undefined, xyz) 
    var z = Logic.object; 

    xyz.subnodes = [x,y,z] 

    dynamic_object.treeLeft = [asdefg, tree_a] 
    dynamic_object.treeRight = [tree_b, xyz] 
    } 
} 

// DynamicObject.qml 

Rectangle { 
    id: dynamic_object 

    property alias treeLeft : tree_left.subnodes 
    property alias treeRight: tree_right.subnodes 

    Rectangle { 
    id: content_area 

    Node { 
     id: tree_left 

     labelText: "left" 

     anchors.left: parent.left 
    } 

    Node { 
     id: tree_right 

     labelText: "right" 

     anchors.right: parent.right 
    } 
    } 
} 

// Node.qml 

ColumnLayout { 
    id: node 

    default property alias subnodes: subnodes_area.data 
    property alias labelText: label.text 

    Rectangle { 
    id: header_area 

    Text { 
     id: label 
    } 

    MouseArea { 
     id: mouse_area 

     anchors.fill: parent 

     hoverEnabled: true 
     onHoveredChanged: { 
     console.debug(main_container) // works fine 
     console.debug(dynamic_object) // **generates the error for all nodes but the root one** 
     } 
    } 
    } 

    ColumnLayout { 
    id: subnodes_area 

    anchors.top: header_area.bottom 
    } 
} 

// container_logic 

var component = null 
var owner = main_container 
var object = null 
var data = null 

function createComponent(type, info, callback, container) { 
    callback = callback || finishComponent 
    owner = container || main_container 

    if(component != null) { 
    console.log("Error: a component is being loaded at this time"); 
    return; 
    } 

    component = Qt.createComponent(type) 
    data = info 

    if(component.status === Component.Ready) { 
    callback() 
    } else if(component.status === Component.Loading) { 
    component.statusChanged.connect(callback) 
    } else { 
    console.log("Error loading component:", component.errorString()) 
    } 
} 

function finishComponent() { 
    if(component.status === Component.Ready) { 
    object = component.createObject(owner, data) 
    if(object === null) { 
     console.log("Error creating object") 
    } 
    } else if(component.status === Component.Error) { 
    console.log("Error loading component:", component.errorString()) 
    } 
    resetData() 
} 

function resetData() { 
    component = null; 
    data = null; 
} 
+0

Puoi mostrare un semplice esempio per capire meglio cosa stai cercando di fare? – koopajah

+0

fatto, spero di non aver dimenticato nessuna parte cruciale e che chiarirà quali sono le mie intenzioni –

+0

Stai dando a tutti gli oggetti dinamici lo stesso id? – Jay

risposta

4

Secondo http://qt-project.org/doc/qt-4.8/qdeclarativedynamicobjects.html:

  • If Qt.createComponent() is used, the creation context is the QDeclarativeContext in which this method is called
  • If a Component{} item is defined and createObject() is called on that item, the creation context is the context in which the Component is defined

Il problema era che la funzione createComponent() per ogni il successivo Node è stato chiamato dal contesto di main_container, impedendo così ai discendenti di essere in grado di risolvere l'id dynamic_object.

risolto spostando il codice responsabile per la creazione dei nidificati Node s al file Node.qml (in realtà in un file javascript importati da quel documento QML, ma il risultato è lo stesso).

Problemi correlati