2010-07-01 7 views
9

Grüße,QGLWidget und Hardwarebeschleunigung? Alle

Hat Subklassen QGLWidget einfach und Neuimplementierung paintEventO() die Verwendung von OpenGL und Hardware-Beschleunigung machen? Ich erstelle einen QPainter und zeichne QImages in diesem paintEvent().

Was passiert in der paintEvent() - Methode von QGLWidget? Konvertiert es die Bilder (QImage, QPixmap) in OpenGL-Texturen?

Verwendet es Hardwarebeschleunigung für die Bildskalierung?

Vielen Dank im Voraus, umanga

+1

Sieht sehr unwahrscheinlich aus. Aus den Dokumenten - außer dass Sie den Inhalt des Widgets nicht mit QPainter usw. zeichnen, verwenden Sie die standardmäßigen OpenGL-Rendering-Befehle. – tathagata

+2

@tathagata: leider liegst du falsch, trotz der upvote; Bitte lies meine Antwort auf die Frage. –

+0

Danke Greg, dass du das herausgebracht hast! Ich habe nur eine logische Vermutung gemacht. Ich vermute, ich lag falsch. – tathagata

Antwort

13

Werfen Sie einen Blick auf http://doc.qt.io/archives/4.6/opengl-2dpainting.html für ein lehrreiches Beispiel, wo Sie auch das folgende Zitat finden: "Es ist möglich, seine [QGLWidget] paintEvent() zu replizieren und QPainter auf dem Gerät zu zeichnen, genau wie Sie würde mit einem QWidget. Der einzige Unterschied ist, dass die Malvorgänge in Hardware beschleunigt werden, wenn es von den OpenGL-Treibern Ihres Systems unterstützt wird. "

Also, die Antwort auf Ihre erste Frage ist ja.

Für die genaue Einzelheiten der Durchführung herauszufinden, wollen sie sich ein Stück Sourcecode von QOpenGLPaintEngine einen schnellen Blick nehmen (die durch die Suche im Internet zu finden sind):

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

dies Ihre Frage beantwortet In Bezug auf QImages werden sie tatsächlich mit Texturen gezeichnet.

+0

vielen Dank Greg! das löste meine Zweifel. –

+3

Die Vorteile von opensource! –

6

Ja, wenn Sie GL in einem QGLWidget-Befehle verwenden, innerhalb der paintGL, resizeGL und initializeGL Methoden, erhalten Sie volle Hardware-Beschleunigung (falls vorhanden) erhalten.

Es scheint auch, dass die Verwendung von QPainter in einem QGLWidget auch HW-Beschleunigung, da es eine OpenGL QPainEngine-Implementierung gibt, können Sie darüber lesen here.

Verwandte Themen