Frage

Ich habe mich schon einmal von Qglwidget abgeleitet, wie SO:

class MyGLWidget : public QGLWidget
{
public:
   // stuff...

   virtual void initializeGL() { /* my custom OpenGL initialization routine */ }

   // more stuff...
};

Ich finde jedoch, dass initializegl nicht aufgerufen wird (Einstellen eines Haltepunkts in der QT -Bibliothek, wenn qglwidget: initializegl (), wenn er erstellt wurde).

// initializeGL, resizeGL, paintGL not called
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));

// initializeGL, resizeGL, paintGL *still* not called
ui.graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer)));

Wo ist der richtige Ort, um den Code zu platzieren, der sich derzeit in myglwidget :: initializegl () befindet?

War es hilfreich?

Lösung 5

Ich werde weitermachen und meine eigene Frage beantworten. Das ist nicht optimal, aber so habe ich das Problem umgegangen.

Anstatt von

ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));

Ich habe das stattdessen:

ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers))));

CustomContext ist eine Klasse, die sich von QglContext abstellt. Ich habe das Mitglied erstellen, wie so:

virtual bool create(const QGLContext *shareContext = 0)
{
    if(QGLContext::create(shareContext))
    {
        makeCurrent();

        /* do my initialization here */

        doneCurrent();

        return true;
    }

    return false;
}

Ich denke nicht, dass dies der optimale Weg ist, dies zu tun, aber es ist besser als die Alternative, überhaupt keinen spezifischen Initialisierungsschritt zu haben. Ich würde mich immer noch freuen, wenn jemand eine bessere Antwort hinterlässt!

Andere Tipps

Der SetUpViewport -Slot eines benutzerdefinierten QGraphicsView kann verwendet werden, um UpdateGl () auf dem QGLWIDGET aufzurufen, wodurch initgl () aufgerufen wird.

class MyGraphicsView : public QGraphicsView
{
    //... The usual stuff

protected slots:
    virtual void setupViewport(QWidget *viewport)
    {
        QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
        if (glWidget)
            glWidget->updateGL();
    }

};

Ich habe also festgestellt, dass QGraphicsView einen benutzerdefinierten Ereignisfilter auf Ihrem QGLWIDGE -Ansichtsfenster installiert, sodass die Ereignisse initialisieren/revarch/repaint nie zu sehen sind. Dies wurde wahrscheinlich getan, damit es mit dem Nachteil () usw. ordnungsgemäß funktioniert.

Meine aktuelle beste Auflösung ist es, das gewünschte Ereignis entweder in QGraphicsView :: resizeEvent ()/usw. zu fangen oder einen benutzerdefinierten Eventfilter in Ihrer von QGlwidget abgeleiteten Klasse zu installieren, um die Größen-/Farbe/usw. Ereignisse vor QGRAPHICSVIEWs benutzerdefinierten Event -Filter zu fangen.

Der Schmerz, der Schmerz, die Integration von Widgets, die von Qglwidgets in QGraphicsView abgeleitet sind, macht keinen Spaß der Teile von QT, von denen ich weiß, dass dies definitiv einer der unordentlicheren Bereiche ist. Ich habe einen Teil von verwendet kgllib (Aus KDE), als WidgetProxy bezeichnet wird und ein sehr anständiger Wrapper um ein Qglwidget ist. Ich habe es so geändert, dass es meinen Bedürfnissen entspricht, aber für die meisten allgemeinen Fälle einigermaßen gut funktioniert, in denen Sie eine existierende Klasse verwenden möchten, die von QGlwidget in einem QGraphicsView abgeleitet ist und andere Dinge darüber zeichnen.

initializeGL() wird erst nach dem ersten Anruf angerufen paintGL() oder resizeGL() und nicht, wenn das Widget konstruiert ist. Dies kann so spät geschehen, wie das Widget zum ersten Mal sichtbar gemacht wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top