TL寿命; DR
如何正确地传递信息,包装成一个QObject
以QML中的信号可能与高频发射,减少开销,保证了对象/引用至少执行连接的插槽?管理C++的QObject传递给QML在信号
我有一个C++ QObject注册为QML类型。该对象有一些信号
void someSignal(InformationQObject* someInformation)
在我不通过所有的信息在单独的参数,但是在一个对象 - 类似于例如发现的信号在例如MouseArea
中,例如信号
void clicked(QQuickMouseEvent *mouse)
现在我想知道这个someInformation
的正确的生命周期管理。
到目前为止,我的目标,我有一个成员:
InformationQObject* m_lastInformation
,并送我用的信号:
void sendMySignal(/* possible params */)
{
delete m_lastInformation
m_lastInformation = new InformationQObject(/* right params here */)
emit someSignal(m_lastInformation)
}
现在,这似乎是错误的。
原因:如果你看看QQuickMouseArea
的实现,他们会以不同的方式做。看起来他们并不是为每个事件创建一个新对象,而是似乎是回收现有对象。我觉得很难跟随他们的所有来源,但我认为他们的文件之一,此评论给出了一个很好的理由:
QQuickPointerEvent作为长寿对象从一个指向与 事件存储数据设备,例如鼠标,触摸或平板电脑事件, 在事件交付期间。它还提供了以后可用于将事件展示给QML的属性,这与使用QQuickMouseEvent, QQuickTouchPoint,QQuickKeyEvent等完成的相同。由于一次只能发送一个事件 ,因此该类实际上是单例。我们不担心有关QObject开销的 ,因为这些实例是长期存在的:我们不会为 动态创建并销毁每个事件的此类对象。
但是,这是它让我很难看透,他们是如何做到的。此评论涉及QQuickPointerEvent
。存在QQuickPointerMouseEvent
。在他们的信号中,他们通过一个QQuickMouseEvent*
后者是指向其成员之一QQuickMouseEvent quickMouseEvent
。
在某些时候,不知何故,这个指针在QML
无效MouseArea {
anchors.fill: parent
property var firstEvent
onClicked: {
if (firstEvent === undefined) firstEvent = mouse
console.log(mouse.x, mouse.y)
console.log(firstEvent.x, firstEvent.y) // -> TypeError on second and consecutive clicks.
}
}
所以必须有一些神奇发生的事情,我不明白。
如果您需要m_lastInformation始终存在并且它的信息应该总是逐个处理 - >在您的C++ func中使用QMutex和QMutexLocker。如果m_lastInformation的信息应该更新而没有carrieng,如果旧实例已经处理 - >在C++中使用QSharedPointer for m_lastInformation – Xplatforms