gpt4 book ai didi

javascript - Qml 属性钩子(Hook)

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:09 26 4
gpt4 key购买 nike

假设有一个名为 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;
}

我想要的是每次 foo 属性被 getter 或 setter 访问时得到通知。对于 setter 也许我可以使用 fooChanged 信号,但是对于 getter 没有这样的解决方案。我也可以将 Test 类型实现为带有 Q_PROPERTY 宏的 C++ 类,并从属性 getter/setter 发出相应的信号,但我真的很想将大部分代码留在 Qml 端。

有没有其他方法来 Hook Qml 属性访问?

最佳答案

好的,经过几个小时的谷歌搜索、阅读 Qml 和 JS 文档后,我想我终于找到了解决方案。由于 Qml 不完全支持 JS,因此涉及一些 hack,但此解决方案仍然有效。主要思想是使用 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
}

希望这个答案能帮助到其他人。

关于javascript - Qml 属性钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com