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