Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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

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++ 如何从QQuickFramebufferObject中访问关联的渲染器对象_C++_Qt_Qml_Constants_Qtquick2 - Fatal编程技术网

C++ 如何从QQuickFramebufferObject中访问关联的渲染器对象

C++ 如何从QQuickFramebufferObject中访问关联的渲染器对象,c++,qt,qml,constants,qtquick2,C++,Qt,Qml,Constants,Qtquick2,我试图在创建时将其存储为成员指针,以便以后可以访问: QQuickFramebufferObject::Renderer* MyItem::createRenderer() const { m_renderer = new MyItemRenderer(this); return m_renderer; } 。。。但这不起作用-Qt需要createRenderer作为常量方法,所以我不能在其中指定m_渲染器。我可以使用mutable,但这是一种黑客行为,风险很大,因为它可能会打

我试图在创建时将其存储为成员指针,以便以后可以访问:

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
    m_renderer = new MyItemRenderer(this);
    return m_renderer;
}
。。。但这不起作用-Qt需要
createRenderer
作为常量方法,所以我不能在其中指定m_渲染器。我可以使用
mutable
,但这是一种黑客行为,风险很大,因为它可能会打破Qt内部的假设

有什么合适的方法吗?

我想到了一个方法:

MyItemRenderer::synchronize
中,将项目的渲染器设置为
this
。我不太喜欢这个,因为它滥用了
同步
,但它肯定比
可变

好得多。我想到了一种方法:

MyItemRenderer::synchronize
中,将项目的渲染器设置为
this
。我不太喜欢这个,因为它滥用了
同步
,但它肯定比
可变

好得多

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
    return new MyItemRenderer();
}
更多信息。本页末尾说明如下:

但是,当必须重新创建FBO时,有一种特殊情况:将窗口移动到具有不同设备像素比的屏幕时。例如,在OSX系统上,在视网膜和非视网膜屏幕之间移动窗口必然需要一个新的、两倍或半倍大小的帧缓冲区,即使窗口尺寸在设备独立单元中相同。与普通大小调整一样,Qt准备在必要时通过请求具有不同大小的新帧缓冲区对象来处理此问题。这里一个可能的陷阱是应用程序缓存工厂函数的结果:避免这种情况createFramebufferObject()和createRenderer()绝不能缓存其返回值。只需创建一个新实例并返回它。保持简单

这个怎么样

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
    return new MyItemRenderer();
}
更多信息。本页末尾说明如下:

但是,当必须重新创建FBO时,有一种特殊情况:将窗口移动到具有不同设备像素比的屏幕时。例如,在OSX系统上,在视网膜和非视网膜屏幕之间移动窗口必然需要一个新的、两倍或半倍大小的帧缓冲区,即使窗口尺寸在设备独立单元中相同。与普通大小调整一样,Qt准备在必要时通过请求具有不同大小的新帧缓冲区对象来处理此问题。这里一个可能的陷阱是应用程序缓存工厂函数的结果:避免这种情况createFramebufferObject()和createRenderer()绝不能缓存其返回值。只需创建一个新实例并返回它。保持简单


顺便说一句,你为什么需要这样做?@peppe:因为我在QML之上实现了一个类似于QtQuick的系统(称为Snappy);在我的系统中,我希望子项的渲染器能够访问SnappyScene的渲染器(SnappyScene包含我系统中的所有项),因为这样他们可以访问其modelViewMatrixStack、其currentShader等,并实现该访问,我像这样遍历指针:SomeSnappyItemRenderer->SomeSnappyItem->SnappyScene->SnappyScene::Renderer。SnappyScene源于QQFBO。从概念上讲,QQFBO的设计是将所有状态存储在QQFBO子类中,渲染器访问它并复制出渲染所需的内容(由于多线程而复制)。@peppe:我知道这一点,但正如我前面的评论所解释的,这对于我的(公认不寻常的)用例来说是不够的。顺便说一下,你为什么需要这样做?@peppe:因为我在QML之上实现了一个类似于QtQuick的系统(称为Snappy);在我的系统中,我希望子项的渲染器能够访问SnappyScene的渲染器(SnappyScene包含我系统中的所有项),因为这样他们可以访问其modelViewMatrixStack、其currentShader等,并实现该访问,我像这样遍历指针:SomeSnappyItemRenderer->SomeSnappyItem->SnappyScene->SnappyScene::Renderer。SnappyScene源于QQFBO。从概念上讲,QQFBO的设计是将所有状态存储在QQFBO子类中,渲染器访问它并复制出渲染所需的内容(由于多个线程而复制)。@peppe:我知道这一点,但正如我前面的评论所解释的,这对于我的(无可否认的不寻常)来说是不够的用例。不过我不是说缓存。缓存意味着在多次调用createRenderer时返回相同的Renderer对象。我说的只是存储/访问我上次返回的渲染器,而不是缓存。缓存意味着在多次调用createRenderer时返回相同的Renderer对象。我说的只是存储/访问我上次返回的渲染器。