gpt4 book ai didi

c++ - 从 C++ 向 QML 发出信号以读取 Q_PROPERTY 是一个同步事件吗?

转载 作者:太空狗 更新时间:2023-10-29 21:22:29 32 4
gpt4 key购买 nike

使用 Qt 5.1 我有这个:

Q_PROPERTY(float d1 MEMBER data1 NOTIFY datas_changed_signal)
Q_PROPERTY(float d2 MEMBER data2 NOTIFY datas_changed_signal)

....

void setOBJ(nobj){
obj=nobj; //these are pointers to a data structure
data1=nobj->data1(); //assign to member of this class
data2=nobj->data2();

emit datas_changed_signal();
}

我的类收到一个指向某些数据的指针,nobj 然后我希望我的 QML 能够访问这些数据。其实nobj包含的数据远不止2个数据项,这里为了简单起见还是表述一下。

我想知道一些事情。首先,当 setOBJ 被频繁快速调用时会发生什么。在再次调用 setOBJ 之前,QML 是否会收到通知但不会读取 MEMBER(data1 或 data2)的风险? QML 会因此错过一些更新吗?例如,如果它是异步的,就会发生这种情况。或者,我能否始终指望 QML 每次发出上面的信号时都能获取数据?

其次,在我看来,创建中间数据成员来存储来自传入对象 nobj 的数据会产生一些不必要的开销。我试过这个:

    Q_PROPERTY(float d1 MEMBER obj->data1() NOTIFY datas_changed_signal)

但是 MOC 似乎不喜欢以这种方式使用 Q_PROPERTY(无法编译)。会有类似的选择吗?

更新:我找到了this method (link)这似乎是 Q_PROPERTY 的可行替代方案,用于将数据从 C++ 发送到 QML,我可以将我的数据片段作为参数发送到 QML 函数。这是一个好的选择吗?

最佳答案

信号和槽在默认情况下是同步实现的,并且即使异步实现时也总是按顺序处理,甚至跨越线程边界传递。因此,您不必担心您的 QML 会以错误的顺序获取信号。

而且,事实上,默认情况下,信号实际上会立即触发所有绑定(bind)的目标代码。即,这个:

emit datas_changed_signal();

几乎就像调用:

slotFunction1();
slotFunction2();
...

因此,实际上,任何附加的 QML javascript (onDatas_changed_signal) 都会被立即调用。

信号和槽是将数据发送到 QML 的首选方式,因为它为独立于 C++ 底层模型的 QML 提供了更大的支持,所以我会坚持使用属性、信号和槽。有一天,您的 QML 代码可能需要扩展,并且在属性更改时会发生多种情况,如果您通过属性而不是直接调用 QML 函数来执行此操作,那将简单而巧妙。

关于c++ - 从 C++ 向 QML 发出信号以读取 Q_PROPERTY 是一个同步事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20509485/

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