QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性

QML: modifying a property of a Child object that is defined in a different QML file (not main.qml)

本文关键字:QML 属性 定义 main 对象 而非 修改 文件      更新时间:2023-10-16

基本上,我有这样的东西:

Main.qml:

ApplicationWindow{
width: 500
height: 500
Page{
id: page0
DataPage{
id: datapage0  
}
}
}

DataPage.qml:

Page{
id: displayPage
DataDisplay{
id: dataShow
}
}

DataDisplay.qml:

Label{
text: "data: "
}
TextArea{
id: dataArea
text: ""
}

我已经删除了我认为不相关的东西(如锚点、高度、宽度等(。现在,在main.qml中,我有一个来自c++后端的信号:

Connections{
target: modb
onPostData: {
page0.datapage0.dataShow.dataArea.text = string;
}

我得到以下错误:TypeError:无法读取未定义的属性"dataArea">

因此,我想问:如何将该信号连接到DataDisplay.qml中定义的子对象?我可以使用信号将信息获取到main.qml中,但似乎无法取消引用子对象

编辑:

main.cpp:

QQmlContext* ctx0 = engine.rootContext();
ctx0->setContextProperty("ark", &ark);
QQmlContext* ctx1 = engine.rootContext();
ctx1->setContextProperty("comm", ark.comm);
QQmlContext* ctx2 = engine.rootContext();
ctx2->setContextProperty("modb", ark.modb);

是我如何设置Context(如您所见,共有3个类(。我可以将三个信号中的任何一个信号输入main.qml,也可以调用main.qml中三个信号的任何一个中的插槽;我还没有尝试从其他qml文件中的c++类调用slot,但我认为它会起作用,因为我可以从子访问父属性

1-有3个指针指向同一对象。一个就足够了。真正地

2-只要ark正确实现,就可以从QML访问ark.commark.modb,而无需单独公开它们。

3-你似乎不了解ids的范围。看看这个详尽的答案。无论您在哪里建立连接,dataShow都不可见。

4-上下文属性不是很有效,这更像是一种向qml公开C++的"快速而肮脏"的方法。为了获得最佳性能,请考虑更有效的方法。

总而言之,你会表现出"超越自我"的典型症状。在练习之前花点时间学习。

您确实假设您也可以在其他qml中使用modb变量,因为它已添加到rootContext中。我建议你这样做。

您可以尝试的另一个选项是只使用dataArea.text = string,因为id到处都是(毕竟是javascript(,所以在这种情况下应该使用强id。

另一个选项是定义property alias的,以便在对象上传递字符串(请参阅Qt文档(。或者使用property string,但这是更多的工作。