l'appel de Qt QGraphicsView::setViewport avec un QGLWidget
J'ai 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 j'essaie d'initialiser un QGraphicsView avec mon custom QGLWidget que la fenêtre d'affichage, initializeGL n'est pas appelée (définition d'un point d'arrêt à l'intérieur de la bibliothèque Qt, ni ne QGLWidget::initializeGL() lors de la création de la plaine).
//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ù est le bon endroit pour placer le code qui se trouve actuellement dans MyGLWidget::initializeGL()?
OriginalL'auteur moswald | 2009-07-10
Vous devez vous connecter pour publier un commentaire.
La setupViewport fente d'un QGraphicsView pourrait être utilisé pour appeler updateGL() sur le QGLWidget, ce qui va provoquer initializeGL() est appelé.
OriginalL'auteur baysmith
Donc ce que j'ai trouvé est QGraphicsView installe une coutume eventFilter sur votre QGLWidget fenêtre d'affichage de sorte qu'il ne voit jamais les initialiser/redimensionner/repeindre les événements. C'est probablement ce qui a été fait pour le faire fonctionner correctement avec drawBackground (), etc.
Ma meilleure résolution est de prendre de l'événement souhaité, soit en QGraphicsView::resizeEvent()/etc, ou d'installer un custom eventFilter sur votre QGLWidget classe dérivée pour attraper le redimensionner/peinture/etc événements avant de QGraphicsView personnalisé eventFilter les avale.
OriginalL'auteur NuShrike
La douleur, la douleur, ... l'intégration de widgets dérivé de QGlWidgets en QGraphicsView n'est pas drôle, des pièces de Qt que je sais que c'est certainement l'un des messier domaines. J'ai fini par utiliser une partie de kgllib (de kde) appelé widgetproxy qui est un très décent wrapper autour d'un QGlWidget. Je l'ai modifié pour l'adapter à mes besoins, mais qui fonctionne plutôt bien pour la plupart des cas généraux où vous souhaitez utiliser un existant classe dérivée de QGlWidget à l'intérieur d'un QGraphicsView et dessiner d'autres choses sur le dessus de cela.
OriginalL'auteur Harald Scheirich
initializeGL()
de ne pas être appelé jusqu'à ce que le premier appel àpaintGL()
ouresizeGL()
et non pas lorsque le widget est construit. Cela peut arriver aussi tard que lorsque le widget est d'abord rendue visible.OriginalL'auteur Troubadour
Je vais aller de l'avant et répondre à ma propre question. Ce n'est pas optimal, mais c'est la façon dont j'ai contourné le problème.
Au lieu de
J'ai ceci à la place:
CustomContext est une classe qui dérive de QGLContext. J'ai remplacé le créer membre, comme suit:
Je ne pense pas que ce est la meilleure façon de le faire, mais c'est mieux que l'alternative de ne pas avoir de spécifique étape d'initialisation. Je serais toujours heureux d'avoir quelqu'un congé d'une meilleure réponse!
OriginalL'auteur moswald