qt - QGLWidget和硬件加速?

标签 qt opengl qt4 hardware-acceleration qglwidget

大家问候,

是否仅将QGLWidget子类化并重新实现paintEvent()即可利用OpenGL和硬件加速功能?
我创建一个QPainter并在此paintEvent()中绘制QImages。

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

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

提前致谢,
乌曼加

最佳答案

看看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的问题,它们确实是使用纹理绘制的。

关于qt - QGLWidget和硬件加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3156301/

相关文章:

c++ - gluLookAt 的相机外部矩阵

c++ - 如何使用 assimp 在 C++ 中旋转蒙皮模型的骨骼?

java - libGDX Stage 没有响应,新的完全白度,视口(viewport)不起作用

c++ - 运行 Qt 单元测试

c++ - 如何检测 QString 是否由所有数字字符组成?

c++ - Debian 上的 Qt5 示例包

c++ - 在 catch-all 回调中识别来自 QDBusPendingCallWatcher 的原始调用

python - 如何在pyqt Qmenu中获取选定的项目

c++ - 在 QT Creator 中使用计时器更改速度

qt - 在其他其他QML文件的QML中声明全局属性