Qml属性挂钩
Qml property hooks
假设有一个名为Test
的Qml类型具有foo
属性,它的实现如下:Test.qml
// Not necessarily QtObject, but derived from QObject
QtObject {
// Not necessarily var/property, but must behave like property (i.e. be accessible using "<instance>.foo")
property var foo
}
并以以下方式使用:main.qml
import "."
Test {
id: _test
}
function baz() {
var x = _test.foo;
_test.foo = x;
}
我想要的是每次getter或setter访问foo
属性时都得到通知。对于setter,也许我可以使用fooChanged
信号,但对于getter,并没有这样的解决方案。此外,我可以用Q_PROPERTY
宏将Test
类型实现为C++
类,并从属性getter/setter中发出相应的信号,但我真的想把大部分代码留在Qml端。
是否有其他方法可以挂接Qml属性访问?
好吧,经过几个小时的谷歌搜索,阅读了Qml和JS文档,我想我终于找到了解决方案。它涉及一些技巧,因为JS在Qml中不完全支持,但这个解决方案仍然有效。其主要思想是使用JS defineProperty
方法来动态地向现有对象添加属性。现在我的Test.qml
文件如下:
QtObject {
// NOTE: .defineProperty does not correctly work for Qml objects, so JS object is used instead
property var object: { return {}; }
Component.onCompleted: {
Object.defineProperty(
object,
"foo",
{
get: function () {
// getter handling here
},
set: function (value) {
// setter handling here
}
}
);
}
}
在main.qml
中,_test
实例声明如下:
property alias _test: _testDeclaration.object
Test {
id: _testDeclaration
}
希望这个答案能帮助其他人。
相关文章:
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- Qt Quick-如何仅从c++代码与qml属性交互
- 如何将类的属性从 c++ 获取到 QML 中
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 属性分配无效:"displayText"是文本字段 qml 中的只读属性
- QVariants 在 QML 中的C++和属性中的使用
- 在 QML 中更改父属性时更改子属性
- QML / C++可选属性
- QML 检测到属性宽度的绑定循环(TextMetrics 行为很奇怪)
- 可以从C++在QML上编写上下文属性吗?
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 如何从 c++ 更改 QML 项的属性
- 使用 QAbstractListModel 分配 QML 布尔属性失败
- QML 无法分配给不存在的属性
- 从C++使用编译时安全性更改 QML 属性
- Javascript 函数作为从 c++ 定义的 QML 属性
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- 从C 读取QML数组属性
- 如何使用 API 获取 QML 对象的 id 属性C++
- Qt-Qml连接到上下文属性的QObject属性的信号