首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGLWidget和硬件加速?

QGLWidget和硬件加速?
EN

Stack Overflow用户
提问于 2010-07-01 16:56:42
回答 2查看 7.8K关注 0票数 9

大家好,

简单地将QGLWidget子类化并重新实现paintEvent()是否利用了OpenGL和硬件加速?我创建了一个QPainter并在这个paintEvent()中绘制了QImages。

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

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

提前谢谢你,umanga

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-01 20:46:52

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

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

为了弄清楚实现的确切细节,让我们快速浏览一下QOpenGLPaintEngine的一段源代码(可以在互联网上搜索到):

代码语言:javascript
复制
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的问题,它们确实是使用纹理绘制的。

票数 13
EN

Stack Overflow用户

发布于 2010-07-01 19:47:44

是的,如果您在QGLWidget中使用GL命令,在paintGL、resizeGL和initializeGL方法中,您将获得完全的硬件加速(如果可用)。

此外,似乎在QGLWidget中使用QPainter也可以获得硬件加速,因为有一个OpenGL QPainEngine实现,您可以阅读该here的相关内容。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3156301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档