2010-07-01 22 views
9

Saluti tutti,QGLWidget e accelerazione hardware?

Semplicemente la sottoclasse di QGLWidget e il reimplementing di paintEvent() fanno uso di OpenGL e dell'accelerazione hardware? Creo un QPainter e disegno QImages in questo paintEvent().

Cosa succede nel metodo paintEvent() di QGLWidget? Converte le immagini (QImage, QPixmap) in trame OpenGL?

Utilizza l'accelerazione hardware per il ridimensionamento delle immagini?

Grazie in anticipo, umanga

+1

Sembra molto improbabile. Dai documenti - eccetto che, invece di disegnare il contenuto del widget usando QPainter ecc., Usi i comandi di rendering OpenGL standard. – tathagata

+2

@tathagata: sfortunatamente ti sbagli, nonostante l'upvote; per favore leggi la mia risposta alla domanda. –

+0

Grazie Greg, per averlo fatto notare! Stavo solo facendo un'ipotesi logica. Credo di aver sbagliato. – tathagata

risposta

13

Date un'occhiata a http://doc.qt.io/archives/4.6/opengl-2dpainting.html per un esempio istruttivo, dove si possono anche trovare la seguente citazione: "è possibile re-implementare la sua paintEvent [QGLWidget]() e utilizzare QPainter per disegnare sul dispositivo, proprio come si con un QWidget. L'unica differenza è che le operazioni di disegno verranno accelerate nell'hardware se supportate dai driver OpenGL del sistema. "

Quindi, la risposta alla tua prima domanda è sì.

per capire i dettagli esatti di attuazione, diamo una rapida occhiata ad un pezzo di codice sorgente QOpenGLPaintEngine (che può essere trovato cercando su Internet):

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); 
    } 
} 

Questo risponde alla tua domanda riguardo a QImages, sono effettivamente disegnati usando trame.

+0

grazie mille Greg! questo ha chiarito i miei dubbi. –

+3

I vantaggi di opensource! –

6

Sì, se si utilizzano i comandi GL all'interno di un QGLWidget, all'interno dei metodi paintGL, resizeGL e initializeGL, si otterrà l'accelerazione hardware completa (se disponibile).

Sembra inoltre che l'utilizzo di QPainter in un QGLWidget ottenga anche l'accelerazione HW, dal momento che esiste un'implementazione OpenGL QPainEngine, si può leggere su tale here.

Problemi correlati