2017-06-22 141 views
1

我試圖把它存儲作爲創建成員指針中訪問相關的渲染對象,因此它可以在以後訪問:如何從一個QQuickFramebufferObject

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const { 
    m_renderer = new MyItemRenderer(this); 
    return m_renderer; 
} 

...但是這行不通 - Qt要求createRenderer是一個const方法,所以我不能在其中分配m_renderer。我可以使用mutable,但這是一種黑客行爲,具有風險,因爲它可能會破壞Qt內部的假設。

任何正確的方法?

+0

順便說一句,你爲什麼需要這樣做? – peppe

+0

@peppe:因爲我在QML之上實現了一個類似於QtQuick的系統(稱爲Snappy);在我的系統中,我希望子項的渲染器能夠訪問SnappyScene的渲染器(SnappyScene包含我係統中的所有項),因爲這樣他們就可以訪問其modelViewMatrixStack,它的currentShader等。並且爲了實現該訪問,我遍歷這樣的指針:SomeSnappyItemRenderer - > SomeSnappyItem - > SnappyScene - > SnappyScene :: Renderer。 SnappyScene來自QQFBO。 –

+0

從概念上講,QQFBO的設計是將所有狀態存儲在QQFBO子類中,渲染器訪問它並*複製*渲染所需的東西(因爲多線程而複製)。 – peppe

回答

0

我想到了一個辦法:

MyItemRenderer::synchronize設置的項目的渲染器this。我不太喜歡這個,因爲它是synchronize的濫用,但它肯定比mutable好得多。

0

這是怎麼回事?

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const { 
    return new MyItemRenderer(); 
} 

更多信息here。在本頁末尾,它陳述如下:

但是,有一個特殊情況時,FBO必須重新創建,無論何時:將窗口移動到具有不同設備像素比率的屏幕時。例如,在OS X系統上移動視網膜和非視網膜屏幕之間的窗口,固有地需要一個新的,兩倍或一半大小的幀緩衝器,即使窗口尺寸在獨立於設備的單元中是相同的。就像普通的調整大小一樣,Qt準備通過在必要時請求一個具有不同大小的新幀緩衝區對象來處理這個問題。這裏有一個可能的缺陷是應用程序緩存了工廠功能的結果:避免這種createFramebufferObject()和createRenderer()絕不能緩存它們的返回值。只需創建一個新實例並將其返回。把事情簡單化。

+0

雖然我不是在談論*緩存*。 *緩存*意味着在多次createRenderer調用中返回相同的Renderer對象。我正在討論簡單地存儲/訪問我返回* *的渲染器。 –