2013-08-09 24 views
5

私は実行時に動的に作成されたコンポーネントでいっぱいになっているコンテナを持っています。これらの各要素(DynamicObjectと呼ぶ)には、サブ要素のツリー(Nodes)が動的に作成されています。さらに、Nodeのコンポーネントは、ツリー構造のように互いに入れ子にすることができます。QML - 祖先のアドレス指定

パラメータを"main_container"に設定し、DynamicObjectをすべて"dynamic_object"に設定します。

main_containerをネストされたNode要素のいずれかから解決しようとすると、すべて正常に動作します。問題は、dynamic_objectをルート以外のNodedynamic_objectの直系子孫/子)から除外しようとするときです。それは、その結果:

ReferenceError: dynamic_object is not defined

私の質問は:この行動の背後にある原因である可能性がありますでしょうか?それらのオブジェクトが動的に作成されているという事実とは関係がありますか? (それは私がいつもmain_containerに対処することができ、qmlコードで静的に宣言されて以来の私の最初の考えでした)。

コード例:(欠けているものがある場合は、コメントに今私を聞かせてください)

// 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

あなたがしようとしていることをよりよく理解できるように簡単な例を表示できますか? – koopajah

+0

done、希望私は重要な部分を忘れていないと私の意図が明確になることを願って –

+0

すべての動的オブジェクトに同じIDを与えていますか? – Jay

答えて

4

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

問題は各createComponent()機能ということでしたその後Nodemain_containerの文脈から呼び出され、子孫がidを解決できなくなるのを防ぐ。

ネストしたNodeを作成するコードをNode.qmlファイル(実際にはそのqmlドキュメントによってインポートされたjavascriptファイルに変換しますが、結果は同じです)に移動して解決しました。

関連する問題