C++ 创建QQuickItem子类的实例时是否存在我不知道的问题';是否不打算渲染或添加到QML树?
正如您所知,QQuickFramebufferObject::Renderer子类不应该直接访问其父项的属性,而应该在其C++ 创建QQuickItem子类的实例时是否存在我不知道的问题';是否不打算渲染或添加到QML树?,c++,qt,qml,qtquick2,qquickitem,C++,Qt,Qml,Qtquick2,Qquickitem,正如您所知,QQuickFramebufferObject::Renderer子类不应该直接访问其父项的属性,而应该在其synchronize()方法中将它们复制到自身。因此代码看起来像这样(使用来自的AUTO\u属性宏): 我希望避免在两个类之间重复属性声明,因此现在我正在实现这个替代解决方案: class MyItem : public QQuickFramebufferObject { AUTO_PROPERTY(int, foo) AUTO_PROPERTY(float,
synchronize()
方法中将它们复制到自身。因此代码看起来像这样(使用来自的AUTO\u属性
宏):
我希望避免在两个类之间重复属性声明,因此现在我正在实现这个替代解决方案:
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树)
引自:
<>这对于从C++代码创建QML对象,显示一个可以可视化渲染的QML对象,或者将非可视QML对象数据集成到C++应用程序中是有用的。
这似乎意味着这种非视觉使用是一种预期的和受支持的用例。但是我不确定我读的是否正确。如果您试图为两个目的重用一个类,最好将该类拆分为两个并使用聚合
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;
};
类MyItem。。。。
{
朋友类MyItemRenderer;
私人:
Data m_Data;//包含属性变量
};
类MyItemRenderer。。。
{
公众:
无效同步(QQuickFrameBufferObject*qqfbo){
自动myItem=静态_转换(qqfbo);
m_data=myItem->m_data;
}
私人:
数据mu数据;
};
将QtObject
用于非可视内容,减少开销。限制是它只能有属性,不能有子项,这有点傻,考虑到它本质上是一个可以有子项的QObject
,该功能只是不向QML公开。@ddriver:但我同步的项目是一个可视项目,我不能将其设为非可视项目,因为那样它就不会显示。
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;
};