Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QML:修改在不同QML文件(非main.QML)中定义的子对象的属性_C++_Qt_Qml - Fatal编程技术网

C++ QML:修改在不同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:

基本上,我有这样的想法:

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: ""
}
我已经删除了我认为不相关的东西(如锚、高度、宽度等)。现在,在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>变量,因为它被添加到根目录< /COD>。我建议这个选择

您可以尝试的另一个选项是只使用
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已删除组件树,直到找到上下文属性为止,在您的情况下,该属性是为根上下文声明的。这需要时间,尤其是在对象树很深的情况下。还有一种危险是,上下文属性可能被一个类似命名的属性所隐藏,该属性将被解析。有了单身汉,这些问题就解决了,访问是直接的,不含糊的。