0
如您所知,QQuickFramebufferObject :: Renderer子類不應直接訪問其父項的屬性,而應將其複製到其自身的synchronize()
方法中。因此,代碼往往看起來像這樣(使用here的AUTO_PROPERTY
宏):是否有創建一個QQuickItem子類的實例的問題,這個實例我不打算渲染或添加到QML樹中?
class MyItem : public QQuickFramebufferObject {
AUTO_PROPERTY(int, foo)
AUTO_PROPERTY(float, bar)
// ...
};
class MyItemRenderer : public QQuickFramebufferObject::Renderer {
public:
void synchronize(QQuickFrameBufferObject* qqfbo) {
auto src = (MyItem*)qqfbo;
foo = src->foo();
bar = src->bar();
}
private:
int foo;
float bar;
// ...
};
我想,以避免重複這兩個類之間屬性的聲明,所以我現在正在執行這一替代解決方案:
class MyItem : public QQuickFramebufferObject {
AUTO_PROPERTY(int, foo)
AUTO_PROPERTY(float, bar)
// ...
};
class MyItemRenderer : public QQuickFramebufferObject::Renderer {
public:
MyItemRenderer() {
copiedData = new MyItem();
}
void synchronize(QQuickFrameBufferObject* qqfbo) {
auto src = (MyItem*)qqfbo;
copiedData.setFoo(src->foo());
copiedData.setBar(src->bar());
}
private:
MyItem* copiedData;
};
我仍然需要寫出並維護複製代碼,如您所見,但它比其他方式更好。
有沒有這樣做的陷阱? (創建一個QQuickItem子類的實例,該實例我不打算渲染或添加到QML樹)。從docs
引用:
這是創建QML從C++代碼對象,是否顯示可以在視覺上呈現的QML對象,或以非視覺QML對象數據集成到一個C有用++應用。
這似乎意味着這種非可視化的用法是一個預期的和支持的用例。但我不確定我是否正確閱讀。
將'QtObject'用於非可視化的東西,減少了開銷。限制是它只能擁有屬性,而不是兒童,這有點愚蠢,考慮到它本質上是一個可以有孩子的QObject,它的功能只是不會暴露給QML。 – dtech
@ddriver:但是我從* **同步*的項目是**視覺項目,我不能將它作爲非可視項目,因爲它不會顯示。 –