Mostrar una secuencia de imágenes con Qt

La solución actual se ve así:

//paintlabel.h
class PaintLabel : public QWidget
{
    Q_OBJECT

public:
    explicit PaintLabel(QWidget *parent = 0);

public slots:
    void setImage(char *img_ptr, QSize img_size, int pitch);

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    QImage image;

}

//paintlabel.cpp

PaintLabel::PaintLabel(QWidget *parent) : QWidget(parent)
{
    setAttribute(Qt::WA_NoSystemBackground, true);
}

void PaintLabel::setImageLive(char *img_ptr, QSize img_size, int pitch)
{
    image = QImage((uchar *)img_ptr, img_size.width(), img_size.height(), pitch, QImage::Format_RGB32).scaled(this->size());
    update();  
}

void PaintLabel::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter;
    painter.begin(this);
    if (!image.isNull()) {
        const QPoint p = QPoint(0,0);
        painter.drawImage(p, image);
    }
    painter.end();
}

Espero 20-40 cuadros por segundo. El problema es que el rendimiento escala realmente mal con el tamaño. Con el tamaño alrededor de fullHD, la pintura tarda 1-2 ms. Pero si lo cambio a 4k, se vuelve muy lento (16 ms de pintura). ¿Hay alguna forma de implementar la misma funcionalidad pero con menos consumo de recursos?

Teóricamente, si cambio la clase principal a QOpenGLWidget, el QPainter se ejecuta con aceleración de hardware. Pero al hacerlo, funciona aún más lento.

Respuestas a la pregunta(1)

Su respuesta a la pregunta