Pregunta

Tengo un qgraphicsscene en el que agrego un Qgraphicsitem. Dentro del Qgraphicsitem, rinde el triángulo utilizado en el ejemplo de Hello Triangle de OpenGL ES 2.0. El problema es que si creo y compilo los sombreadores en cualquier lugar que no sea el QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) función, no se compilan. Sé que deberías tener un contexto de representación de GL activo, pero ¿no sucede eso cuando configuré mi ventana gráfica en un GLWidget? Probé varias cosas como compilarlas en el constructor Qgraphicsitem o en el QgraphicsScene y establecer el Qgraphicsitem como padre (lo que aprendí que son cosas muy estúpidas que hacer), pero (obviamente) nada funciona. Lo que me pareció más lógico era crear una función InitShaders () dentro de la clase Qgraphicsitem y llamarlo después de que el elemento se cree en mi escena, pero eso no funcionó también.

¿Fue útil?

Solución

Cree una clase derivada de QgraphicsView. Anule el SetupViewPort (QWIDGet *Viewport) para inicializar los sombreadores. Esto le permitirá asegurarse de que el contexto sea actual al compilar los sombreadores. Sin embargo, requiere que los elementos se agregen a la escena antes de SetViewPort () se llame en la vista de gráficos.

void MyGraphicsView::setupViewport(QWidget *viewport)
{
    QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
    if (glWidget) {
        glWidget->makeCurrent();
        foreach (QGraphicsItem *item, scene()->items())
        {
            MyGraphicsShaderItem *glItem = qgraphicsitem_cast<MyGraphicsShaderItem*>(item);
            if (glItem)
                glItem->initShader();
        }
        glWidget->doneCurrent();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top