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:但是我从* **同步*的项目是**视觉项目,我不能将它作为非可视项目,因为它不会显示。 –