2012-02-28 71 views
4

我試圖用OpenGL保存QGraphicsScene作爲圖像(png或jpeg),但我不希望圖像依賴於當前視圖(縮放)。這就是爲什麼我不使用grabFrameBuffer,但我使用render()來代替:在Qt中使用OpenGL呈現QGraphicsScene

QImage imgToSave(1024,768,QImage::Format_ARGB32_Premultiplied); 
// fill the image 
// and define rectbuffer(), the QRect() containing what I want to save 
QPainter painter(&imgToSave); 
m_scene = new QGraphicsScene; 
// fill the Scene 
m_scene->render(&painter,imgToSave.rect(),rectbuffer()); 

它確實有效。我的問題是:是否使用OpenGL功能? 如果不是,該怎麼辦?

n.b. :我使用QGLWidget作爲我的GraphicsView的視口。而使用OpenGL的顯示器正在工作。我的顧慮是關於圖像保存。

回答

1

我會猜測:不。因爲要通過OpenGL渲染QGraphicsScene,你需要指定一個QGLWidget派生對象作爲場景的視口 - 你沒有,所以它幾乎可以肯定地使用光柵引擎。其次,QPainter使用你構造它的任何繪畫設備作爲後端,你已經指定了一個不使用OpenGL的直接QImage。

如果你不能/不會通過QGraphicsView使用QGLWidget,那麼你可能能夠呈現到QGLFramebufferObject。但是這帶來了它自身的複雜性,即你必須事先創建一個隱藏的上下文。

+0

嗨,謝謝你的回答。 這很奇怪,我編輯了我的第一篇文章,但沒有了。 我在說我確實使用QGLWidget作爲視口。 OpenGL正在爲GraphicsScene的顯示工作。 所以我的問題是關於圖像保存更多。 我如何指定使用OpenGL與我的QPainter並呈現?我是否必須選擇另一種類型而不是QImage? – RyuKa 2012-02-28 13:57:20

+0

我在一個不同於QImage的繪圖設備的回答中給出了一個建議。但請記住,您必須執行渲染,然後將數據從卡上拉出並將其推入另一個圖像容器(可能是QImage)以保存/操作它 - 所以對於較低分辨率的圖像可能看不到很多性能增益。 – cmannett85 2012-02-28 15:27:28

+0

所以你建議QGLFrameBufferObject而不是QImage,即使我使用QGLWidget? – RyuKa 2012-02-28 15:35:10