2017-01-12 12 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; 
}; 
相关问题