QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
QML: modifying a property of a Child object that is defined in a different QML file (not main.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: ""
}
我已经删除了我认为不相关的东西(如锚点、高度、宽度等(。现在,在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.comm
和ark.modb
,而无需单独公开它们。
3-你似乎不了解id
s的范围。看看这个详尽的答案。无论您在哪里建立连接,dataShow
都不可见。
4-上下文属性不是很有效,这更像是一种向qml公开C++的"快速而肮脏"的方法。为了获得最佳性能,请考虑更有效的方法。
总而言之,你会表现出"超越自我"的典型症状。在练习之前花点时间学习。
您确实假设您也可以在其他qml中使用modb
变量,因为它已添加到rootContext
中。我建议你这样做。
您可以尝试的另一个选项是只使用dataArea.text = string
,因为id到处都是(毕竟是javascript(,所以在这种情况下应该使用强id。
另一个选项是定义property alias
的,以便在对象上传递字符串(请参阅Qt文档(。或者使用property string
,但这是更多的工作。
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- Qt Quick-如何仅从c++代码与qml属性交互
- 如何将类的属性从 c++ 获取到 QML 中
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 属性分配无效:"displayText"是文本字段 qml 中的只读属性
- QVariants 在 QML 中的C++和属性中的使用
- 在 QML 中更改父属性时更改子属性
- 从C++使用编译时安全性更改 QML 属性
- Javascript 函数作为从 c++ 定义的 QML 属性
- 如何将C++属性绑定到 QML 属性
- 当连接的 QML 属性更改时C++对象不会获取值
- C++对象的属性的 QML 属性
- 无法将 QVariantMap 设置为 QML 属性
- Qml属性挂钩
- 如何在C++中动态添加/删除QML属性
- Qt 5.1通过线程的QML属性
- 如何在依赖属性更改时重新计算绑定到 qml 属性的 c++ 函数
- 具有多个线程的 QML C++ 属性绑定
- 在Qt c++中枚举QML属性
- 自定义类型的Qml属性