2017-01-12 29 views
0

如您所知,QQuickFramebufferObject :: Renderer子類不應直接訪問其父項的屬性,而應將其複製到其自身的synchronize()方法中。因此,代碼往往看起來像這樣(使用hereAUTO_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有用++應用。

這似乎意味着這種非可視化的用法是一個預期的和支持的用例。但我不確定我是否正確閱讀。

+0

將'QtObject'用於非可視化的東西,減少了開銷。限制是它只能擁有屬性,而不是兒童,這有點愚蠢,考慮到它本質上是一個可以有孩子的QObject,它的功能只是不會暴露給QML。 – dtech

+0

@ddriver:但是我從* **同步*的項目是**視覺項目,我不能將它作爲非可視項目,因爲它不會顯示。 –

回答

0

您正嘗試爲兩個目的重用類,更好地將類拆分爲兩部分並使用聚合。

class MyItem .... 
{ 
    friend class MyItemRenderer; 

private: 
    Data m_data; // contains the property variables 
}; 

class MyItemRenderer ... 
{ 
public: 
    void synchronize(QQuickFrameBufferObject* qqfbo) { 
     auto myItem = static_cast<MyItem*>(qqfbo); 
     m_data = myItem->m_data; 
    } 
private: 
    Data m_data; 
}; 
相關問題