Pregunta

He derivados de QGLWidget antes, así:

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

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

   // more stuff...
};

Sin embargo, me parece que si trato de inicializar un QGraphicsView con mi costumbre QGLWidget que la vista, initializeGL no recibe llamada (establecimiento de un punto de ruptura dentro de la biblioteca Qt, tampoco lo hace QGLWidget :: initializeGL () cuando se crean sin formato) .

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

¿Dónde está la ubicación correcta para colocar el código que reside actualmente en MyGLWidget :: initializeGL ()?

¿Fue útil?

Solución 5

Voy a seguir adelante y responder a mi propia pregunta. Esta no es la óptima, pero así es como he conseguido solucionar el problema.

En lugar de

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

Tengo esto en su lugar:

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

CustomContext es una clase que deriva de QGLContext. He anulado el miembro de crear, de esta manera:

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

        /* do my initialization here */

        doneCurrent();

        return true;
    }

    return false;
}

No creo que esta es la mejor manera de hacer esto, pero es mejor que la alternativa de no tener un paso de inicialización específica en absoluto. Todavía estaría feliz de tener a alguien dejar una mejor respuesta!

Otros consejos

La ranura setupViewport de un QGraphicsView costumbre podría ser utilizado para llamar updateGL () en el QGLWidget, lo que provocará initializeGL () para ser llamado.

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

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

};

Así que lo que he encontrado es QGraphicsView instala un EventFilter personalizado en su ventana QGLWidget por lo que nunca ve la inicialización / Redimensionar / repintar eventos. Esto probablemente se hizo para hacer que funcione correctamente con drawBackground (), etc.

Mi actual mejor resolución es atrapar el evento deseado, ya sea en QGraphicsView :: resizeEvent () / etc, o instalar un EventFilter personalizado en su clase derivada QGLWidget para coger el cambio de tamaño / pintura / etc eventos antes encargo de QGraphicsView EventFilter los traga.

El dolor, el dolor, la integración de los widgets ... derivados de QGlWidgets en QGraphicsView no es divertido, de las partes de Qt, que yo sepa esto es sin duda una de las zonas más sucios. Terminé usando una parte de kgllib (de kde) llamada widgetproxy que es un envoltorio muy decente en torno a un QGlWidget. He modificado para adaptarlo a mis necesidades, pero funciona razonablemente bien para la mayoría de los casos generales en las que desee utilizar una clase derivada de exisiting QGlWidget dentro de un QGraphicsView y dibujar otras cosas en la parte superior de la misma.

initializeGL() no se llamará hasta que la primera llamada a cualquiera paintGL() o resizeGL() y no cuando se construye el widget. Esto puede ocurrir tan tarde como cuando el widget primero se hace visible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top