C++ QML:修改在不同QML文件(非main.QML)中定义的子对象的属性
基本上,我有这样的想法: Main.qml:C++ QML:修改在不同QML文件(非main.QML)中定义的子对象的属性,c++,qt,qml,C++,Qt,Qml,基本上,我有这样的想法: Main.qml: ApplicationWindow{ width: 500 height: 500 Page{ id: page0 DataPage{ id: datapage0 } } } DataPage.qml: Page{ id: displayPage DataDisplay{ id: dataShow } } DataDisplay.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: ""
}
我已经删除了我认为不相关的东西(如锚、高度、宽度等)。现在,在May.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);
这是我设置上下文的方式(如您所见,共有3个类)。我能够从这三个文件中的任何一个文件中获取信号到main.qml,以及main.qml中三个文件中的任何一个文件中的调用槽;我还没有尝试从其他QML文件中调用C++类的时隙,但我认为它可以工作,因为我可以从子< /p> 访问父属性,因为您确实假设在其他QML中也可以使用<代码> MODB< /Cuff>变量,因为它被添加到
dataArea.text=string
,因为id到处都是(毕竟是javascript),所以在这种情况下应该使用强id
另一个选项是定义
属性别名
,将字符串传递给对象()。或者使用属性字符串,但这需要更多的工作。1-您有3个指针指向同一个对象。一个就够了。真的
2-只要正确实现了ark
,您就可以从QML访问ark.comm
和ark.modb
,无需单独公开它们
3-您似乎不了解id
s的范围。看看这个<代码>数据显示在您建立连接的任何位置都不可见
4上下文属性不是非常有效,这是一种“快速和肮脏”的方法来将C++暴露到QML。为了获得最佳性能,考虑一个.
总之,你表现出“超越自我”的典型症状。在练习之前花点时间学习。您是否考虑过在DataDisplay.qml中添加
连接
块?请发布您是如何将modb
连接到qml的(您是否使用了setContext
?)@Amfasis我在您要求我添加的内容中添加了我尝试在另一个针对modb的页面中创建“连接”,但它给了我一个语法错误。有没有什么特别的方法可以在不是main.qml的qml文件中创建连接?当然没有,你已经一针见血了!由于这个项目的紧迫性,我真的很匆忙。我已经阅读了你的链接,并使用了Singleton的东西(它正在工作)。你知道他们为什么用这种方式实现QML吗?使用上下文方法时,从其他文件访问信号/插槽需要额外的工作,有什么具体原因吗?因为对于上下文属性,qml已删除组件树,直到找到上下文属性为止,在您的情况下,该属性是为根上下文声明的。这需要时间,尤其是在对象树很深的情况下。还有一种危险是,上下文属性可能被一个类似命名的属性所隐藏,该属性将被解析。有了单身汉,这些问题就解决了,访问是直接的,不含糊的。