2010-07-01 57 views
9

全部问候,QGLWidget和硬件加速?

是否简单地继承QGLWidget并重新实现paintEvent()使用OpenGL和硬件加速? 我创建一个QPainter并在这个paintEvent()中绘制QImages。

QGLWidget的paintEvent()方法内发生了什么?它是否将图像(QImage,QPixmap)转换为OpenGL纹理?

它是否使用硬件加速进行图像缩放?

由于提前, umanga

+1

看起来不太可能。从文档 - 除了使用QPainter等绘制小部件的内容,而不是使用标准的OpenGL渲染命令。 – tathagata 2010-07-01 09:10:43

+2

@tathagata:不幸的是,你错了,尽管upvote;请阅读我对这个问题的回答。 – 2010-07-01 13:06:56

+0

感谢Greg,指出了这一点!我只是在做一个合乎逻辑的猜测。猜猜我错了。 – tathagata 2010-07-01 13:44:53

回答

13

看一看http://doc.qt.io/archives/4.6/opengl-2dpainting.html的一个有启发意义的例子,你也可以找到下面的引用:“可以重新实现它的[QGLWidget] paintEvent()并使用QPainter在设备上绘图,就像你一样会有一个QWidget,唯一的区别是如果系统的OpenGL驱动程序支持,绘画操作将在硬件中加速。“

所以,你的第一个问题的答案是肯定的。

搞清楚实施的具体细节,让我们快速浏览一下从QOpenGLPaintEngine一段源代码(可通过搜索互联网可以找到):

void QOpenGLPaintEngine::drawImage(const QRectF &r, const QImage &image, 
           const QRectF &sr, Qt::ImageConversionFlags) 
{ 
    Q_D(QOpenGLPaintEngine); 
    if (d->composition_mode > QPainter::CompositionMode_Plus 
     || d->high_quality_antialiasing && !d->isFastRect(r)) 
     d->drawImageAsPath(r, image, sr); 
    else { 
     GLenum target = (QGLExtensions::glExtensions 
         & QGLExtensions::TextureRectangle) 
         ? GL_TEXTURE_RECTANGLE_NV 
         : GL_TEXTURE_2D; 
     if (r.size() != image.size()) 
      target = GL_TEXTURE_2D; 
     d->flushDrawQueue(); 
     d->drawable.bindTexture(image, target); 
     drawTextureRect(image.width(), image.height(), r, sr, target); 
    } 
} 

这回答了你的问题关于QImages,它们确实是使用纹理绘制的。

+0

非常感谢格雷格!这清除了我的疑惑。 – 2010-07-02 01:15:52

+3

开源的好处! – 2010-07-28 03:28:06

6

是的,如果你使用QGLWidget来绘图内GL命令时,paintGL,resizeGL和initializeGL方法里,你会得到完整的硬件加速(如果可用)。

似乎在QGLWidget中使用QPainter也会得到硬件加速,因为有一个OpenGL QPainEngine实现,您可以阅读有关该here