2017-07-16 2 views
0

Ich wollte ein benutzerdefiniertes OpenGL Widget in einer QML-Anwendung programmieren, um Daten mit MathGL zu plotten.
Um dies zu tun, habe ich einen Blick auf die Szene Grafik Beispiel http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html
Ich habe dann den Code an meine Bedürfnisse angepasst und dann das Problem aufgetreten, dass das Bild nur einen Renderzyklus blinkt und danach nicht mehr erscheint. Im Folgenden sind die wichtigsten Funktionen und Bindungen.Renderproblem mit QOpenGLFunctions

Klasse GLRenderEngine: public QObject, öffentliche QOpenGLFunctions

void GLRenderEngine::render() 
{ 
    if(!m_bInit) 
    { 
     initializeOpenGLFunctions(); 
     m_pGraph = new mglGraph(1); 
     m_bInit = true; 
    } 
    glViewport(m_Viewport.left(), m_Viewport.top(), m_Viewport.width(), m_Viewport.height()); 
    m_pGraph->Clf(); 
    //Graph stuff ... 
    m_pGraph->Finish(); 
    if(m_pWindow) 
     m_pWindow->resetOpenGLState(); 
} 


Klasse GLWidget: public QQuickItem

GLWidget::GLWidget(QQuickItem *parent) : QQuickItem(parent) 
{ 
    m_pRender = 0; 
    connect(this, &QQuickItem::windowChanged, this, &GLWidget::handleWindowChanged); 
} 

void GLWidget::handleWindowChanged(QQuickWindow *win) 
{ 
    if(win) 
    { 
     connect(win, &QQuickWindow::beforeSynchronizing, this, &GLWidget::sync, Qt::DirectConnection); 
     connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GLWidget::cleanup, Qt::DirectConnection); 
     win->setClearBeforeRendering(false); 
    } 
} 

void GLWidget::cleanup() 
{ 
    if(m_pRender) 
    { 
     delete m_pRender; 
     m_pRender = 0; 
    } 
} 

void GLWidget::sync() 
{ 
    if(!m_pRender) 
    { 
     m_pRender = new GLRenderEngine(); 
     connect(window(), &QQuickWindow::beforeRendering, m_pRender, &GLRenderEngine::render, Qt::DirectConnection); 
    } 
    m_pRender->setViewportSize(boundingRect()); 
    m_pRender->setWindow(window()); 
} 

QML-Datei

import QtQuick 2.8 
import QtQuick.Window 2.2 
import GLWidget 1.0 

Window { 
    visible: true 
    width: 320 
    height: 480 

    GLWidget{ 
     anchors.fill: parent 
     id: glView 
    } 

    Rectangle { 
     color: Qt.rgba(1, 1, 1, 0.7) 
     radius: 10 
     border.width: 1 
     border.color: "white" 
     anchors.fill: label 
     anchors.margins: -10 
    } 

    Text { 
     id: label 
     color: "black" 
     wrapMode: Text.WordWrap 
     text: "The background here is a squircle rendered with raw OpenGL using the 'beforeRender()' signal in QQuickWindow. This text label and its border is rendered using QML" 
     anchors.right: parent.right 
     anchors.left: parent.left 
     anchors.bottom: parent.bottom 
     anchors.margins: 20 
    } 
} 

Ich habe auch bemerkt, wenn ich gebraucht QQuickFramebufferObject das Bild disap nach einem Aufruf von update() oder einem resize -Ereignis des Fensters, obwohl die Render-Funktion aufgerufen wird, so meine Vermutung ist, dass entweder die Puffer nicht aktualisiert werden oder etwas anderes mit qt ausgeschaltet ist.
Vielen Dank im Voraus für jede Hilfe.

Antwort

0

Um dieses Problem zu lösen, wechselte ich zur QQuickFrameBuffer-Implementierung und entfernte alle glClear-Befehle, die ich innerhalb der Renderfunktion verwendet hatte, während das Clear Flag der Basisklasse QQuickItem aktiviert war. Es funktioniert jetzt wie ein Charme.

Verwandte Themen