2012-02-28 37 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