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.