Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建QQuickItem子类的实例时是否存在我不知道的问题';是否不打算渲染或添加到QML树?_C++_Qt_Qml_Qtquick2_Qquickitem - Fatal编程技术网

C++ 创建QQuickItem子类的实例时是否存在我不知道的问题';是否不打算渲染或添加到QML树?

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,

正如您所知,QQuickFramebufferObject::Renderer子类不应该直接访问其父项的属性,而应该在其
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;
};