5

実行時に動的に作成されたコンポーネントで満たされるコンテナがあります。これらの要素 ( と呼びましょう) のそれぞれには、動的に作成されるDynamicObjectサブ要素 ( ) のツリーがあります。Nodeさらに、Nodeコンポーネントは相互に入れ子にすることができます (ツリー構造のように)。

コンテナのidパラメータを に設定し"main_container"、すべてのパラメータDynamicObjectを に設定し"dynamic_object"ます。

main_containerネストされたNode要素のいずれかからアドレスを指定しようとすると、すべて正常に機能します。問題は、ルート以外のもの (の直接の子孫/子)dynamic_objectからに対処しようとしたときです。結果は次のとおりです。Nodedynamic_object

ReferenceError: dynamic_object が定義されていません

私の質問は次のとおりです。この動作の背後にある原因は何ですか? それらのオブジェクトが動的に作成されるという事実と関係がありますか? 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;
}
4

1 に答える 1

4

http://qt-project.org/doc/qt-4.8/qdeclarativedynamicobjects.htmlによると:

  • Qt.createComponent() が使用されている場合、作成コンテキストは、このメソッドが呼び出される QDeclarativeContext です。
  • Component{} アイテムが定義され、そのアイテムで createObject() が呼び出された場合、作成コンテキストはコンポーネントが定義されているコンテキストです。

問題は、createComponent()後続の各関数がNodeのコンテキストから呼び出されたため、子孫がidmain_containerを解決できないことでした。dynamic_object

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

于 2013-08-13T11:49:37.333 に答える