大家好,
简单地继承 QGLWidget 并重新实现 paintEvent() 是否使用 OpenGL 和硬件加速?我创建了一个 QPainter 并在这个 paintEvent() 中绘制 QImages。
QGLWidget 的paintEvent() 方法内部发生了什么?它是否将图像(QImage,QPixmap)转换为 OpenGL 纹理?
它是否使用硬件加速来进行图像缩放?
在此先感谢,
大家好,
简单地继承 QGLWidget 并重新实现 paintEvent() 是否使用 OpenGL 和硬件加速?我创建了一个 QPainter 并在这个 paintEvent() 中绘制 QImages。
QGLWidget 的paintEvent() 方法内部发生了什么?它是否将图像(QImage,QPixmap)转换为 OpenGL 纹理?
它是否使用硬件加速来进行图像缩放?
在此先感谢,
查看http://doc.qt.io/archives/4.6/opengl-2dpainting.html以获取一个指导性示例,您还可以在其中找到以下引用:“可以重新实现其 [QGLWidget] paintEvent “
所以,你的第一个问题的答案是肯定的。
为了弄清楚实现的确切细节,让我们快速浏览一段源代码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 的问题,它们确实是使用纹理绘制的。
是的,如果您在 QGLWidget、paintGL、resizeGL 和 initializeGL 方法中使用 GL 命令,您将获得完整的硬件加速(如果可用)。
似乎在 QGLWidget 中使用 QPainter 也可以获得硬件加速,因为有一个 OpenGL QPainEngine 实现,你可以在这里阅读。