Question

Je suis dérivé de QGLWidget avant, comme suit:

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

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

   // more stuff...
};

Cependant, je trouve que si je tente d'initialiser un QGraphicsView avec mon habitude QGLWidget que la fenêtre, initializeGL ne soit pas appelé (définir un point d'arrêt au sein de la bibliothèque Qt, ni ne QGLWidget :: initializeGL () lors de sa création ordinaire) .

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

Où se trouve l'emplacement correct de placer le code qui réside actuellement à MyGLWidget :: initializeGL ()?

Était-ce utile?

La solution 5

Je vais aller de l'avant et répondre à ma propre question. Ce n'est pas optimale, mais voilà comment je suis devenu autour du problème.

Au lieu de

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

J'ai ceci:

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

CustomContext est une classe qui dérive de QGLContext. J'ai surchargé l'membres créent, comme suit:

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

        /* do my initialization here */

        doneCurrent();

        return true;
    }

    return false;
}

Je ne pense pas que ce soit la meilleure façon de le faire, mais il vaut mieux que l'alternative de ne pas avoir une étape d'initialisation spécifique du tout. Je serais toujours heureux d'avoir quelqu'un laisser une meilleure réponse!

Autres conseils

La fente de setupViewport d'un QGraphicsView personnalisé peut être utilisé pour appeler updateGL () sur le QGLWidget, ce qui entraînera initializeGL () à appeler.

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

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

};

Alors ce que j'ai trouvé est QGraphicsView installe un eventFilter personnalisé sur votre fenêtre de QGLWidget il ne voit jamais le initialize / Redimensionner / repeindre les événements. Cela a probablement été fait pour le faire fonctionner correctement avec drawBackground () etc.

Ma meilleure résolution actuelle est de capturer l'événement souhaité soit dans QGraphicsView :: resizeEvent () / etc, ou installer un eventFilter personnalisé sur votre classe dérivée de QGLWidget pour attraper le Resize / peinture / événements etc avant la coutume de QGraphicsView eventFilter les engloutisse.

La douleur, la douleur, ... intégrer des widgets dérivés de QGlWidgets dans QGraphicsView est pas drôle, des parties de Qt que je sais que c'est certainement l'une des zones malpropres. Je fini par utiliser une partie de kgllib (sur kde) appelé widgetproxy qui est un emballage très décent autour d'un QGLWidget. Je l'ai modifié pour répondre à mes besoins, mais fonctionne assez bien pour la plupart des cas généraux où vous souhaitez utiliser une classe exisiting dérivée de QGLWidget dans un QGraphicsView et d'en tirer d'autres choses sur le dessus de celui-ci.

initializeGL() ne sera pas appelé jusqu'à ce que le premier appel soit paintGL() ou resizeGL() et non lorsque le widget est construit. Cela peut se produire aussi tard que lorsque le widget est d'abord rendu visible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top