gpt4 book ai didi

qt - QML - 寻址祖先

转载 作者:行者123 更新时间:2023-12-04 13:07:41 28 4
gpt4 key购买 nike

我有一个容器,它在运行时被动态创建的组件填充。这些元素中的每一个(我们称之为 DynamicObject s)都有一个子元素树(Node s),也是动态创建的。更重要的是,Node组件可以相互嵌套(就像树结构一样)。

让容器有 id参数设置为 "main_container"和每个 DynamicObject将其设置为 "dynamic_object" .

每当我尝试解决 main_container来自任何嵌套 Node元素一切正常。问题是当我尝试解决 dynamic_object 时来自任何 Node除了根(一个是 dynamic_object 的直接后代/ child )。结果是:

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;
}

最佳答案

根据 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()每个后续 Node 的函数从 main_container 的上下文中调用,从而阻止后代解析 dynamic_object ID。

通过移动负责创建嵌套 Node 的代码解决了它s 到 Node.qml文件(实际上是该 qml 文档导入的 javascript 文件,但结果是相同的)。

关于qt - QML - 寻址祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143920/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com