IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

2 QGraphicsView avec QGLWidget [Graphics View]


Sujet :

Qt

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juillet 2008
    Messages : 55
    Points : 45
    Points
    45
    Par défaut 2 QGraphicsView avec QGLWidget
    Bonjour.

    Voilà, je me lance dans un petit programme de traitement d'image. J'utilise pour ça QGraphicsView et QGraphicsScene.
    J'ajoute une image dans la scene avec QGraphicsPixmapItem.

    Lorsque cette image est trop grande (j'en ai de 2500x2500px par exemple) ça rame trop, et pas moyen de faire le moindre traitement (opacité, rotation, etc...) ni même le bouger.

    J'ai alors découvert qu'en faisant un setViewport(new QGLWidget) le traitement était beaucoup plus rapide, ce qui est le cas, peu importe la taille c'est vraiment génial, ça rame pas du tout.

    Seulement voilà, tant que le graphicsview est tout seul ça va. Mais si je veux par exemple faire deux vue d'une même scene j'ai un problème: la rendu est saccadé, et l'item transformé (pas tous) devient par intermittences tout noir. Bref ça marche pas.
    Exemples:
    http://dl.dropbox.com/u/1119453/Imag.../091227_01.jpg
    http://dl.dropbox.com/u/1119453/Imag.../091227_02.jpg

    Source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        vue1 = new Vue(this); //VUE hérite bêtement de QGraphicsView
        vue2 = new Vue(this);
     
        QGraphicsScene *scene = new QGraphicsScene;
     
        vue1->setScene(scene);
        vue1->setViewport(new QGLWidget);
     
        vue2->setScene(vue1->scene());
        vue2->setViewport(new QGLWidget);
     
        this->centralWidget()->layout()->addWidget(vue1);
        this->centralWidget()->layout()->addWidget(vue2);
    Merci d'avance pour toute solution ou explication.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    je n'ai peut etre pas bien saisi mais pourquoi faire 2 vues plutot qu'une seule dans laquelle seraient rajoutées plusieurs images ?

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juillet 2008
    Messages : 55
    Points : 45
    Points
    45
    Par défaut
    il y aura plusieurs images dans la scene. Le but est de pouvoir obtenir différent points de vue de la scene, par exemple une fenetre qui zoom fort et une autre qui montre l'ensemble de la scene.

    Autre utilité, c'est d'avoir un espace de navigation (une miniature de l'ensemble de la scene).

    Donc deux ou plus de vue sur la scene ça m'arrangerait.

    J'ai partiellement résolu le problème, sans utiliser QGLWidget.
    Avec:
    setCacheMode(QGraphicsItem:eviceCoordinateCache); (<--- edit: trouvez l'intrus )

    ...pour les items, et...
    setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
    ...pour le graphicsview.

    Ca rame déjà beaucoup moins, c'est même fluide parfois mais c'est aléatoire. Bref, je vais me contenter de ça pour le moment.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    si tu remanie ta vue de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    vue  = new Vue(this); //VUE hérite bêtement de QGraphicsView
     
    QGraphicsScene *scene = new QGraphicsScene;
    scene->addPixmap(MyQGraphicsPixmapItem1);
    scene->addPixmap(MyQGraphicsPixmapItem2);
     
    vue->setScene(scene);
    vue->setViewport(new QGLWidget);
     
    this->centralWidget()->layout()->addWidget(vue);
    ça change quelquechose ?

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juillet 2008
    Messages : 55
    Points : 45
    Points
    45
    Par défaut
    Merci pour les réponses en passant.

    Mais pour ta solution, je me retrouve qu'avec une seule vue, et là forcément ça marche bien. C'est même très puissant. Mais dans ce cas je n'ai qu'un seul point de vue.

    L'ajout de graphicsitem dans la scene n'est pas un problème (ce seront des calques), c'est juste avoir plusieurs points de vue différents.

    Pour le moment j'ai encore avancé un peu. Je vais attribuer un QGLWidget à la vue courante lorsque elle obtient le focus, et mettre à jour les autres vues seulement tous les x temps. Oui parce que si une seule vue possède un QGLWidget ça marche, mais si il y a d'autres vue on perd toute la puissance puisque tout changement de la scène est répercutée sur les vues, même celles qui n'ont pas de QGLWidget, donc ça se met à ramer monstre.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juillet 2008
    Messages : 55
    Points : 45
    Points
    45
    Par défaut
    un grand merci pour le lien. Pour ma défense, j'ai cherché dans beaucoup d'endroits, et j'y ai trouvé tout ce qui écris là, sauf LA solution:
    "-graphicssystem opengl" à rajouter au programme.

    Je peux maintenant avoir deux vues avec QGLWidget, mais étrangement, bien que les performances soient raisonable (bien plus qu'avant), le résultat n'est pas totalement fluide, là ou c'est étrange c'est que sans QGLWidget c'est carrément fluide (plusieurs avec plusieurs image de ~2500x3000px). Je vais approfondir ça...

    Je dois maintenant me renseigner si cela ne pose pas de problème ailleurs (ne jamais être trop optimiste à la vue d'une solution)... Et recompiler sous Window pour voir si le résultat est le même.

    Encore merci, et désolé d'avoir sous-estimé la FAQ.

    edit: graphicssystem raster donne un résultat aussi bon, et serait apparemment totalement supporté contrairement a opengl qui est encore expérimental pour Qt 4.6

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [QtGui] Problème avec QGraphicsViews
    Par maissaab dans le forum PyQt
    Réponses: 0
    Dernier message: 30/03/2011, 12h40
  2. [Graphics View] Quadriller un plateau réalisé avec QGraphicsView
    Par betsprite dans le forum Débuter
    Réponses: 17
    Dernier message: 02/09/2010, 15h16
  3. [Graphics View] [QGraphicsView] Impossible de peindre mon fond avec QLinearGradient
    Par kaymak dans le forum Débuter
    Réponses: 3
    Dernier message: 22/08/2010, 15h14
  4. problème avec QglWidget en fullscreen
    Par mamelouk dans le forum Qt
    Réponses: 3
    Dernier message: 10/10/2008, 16h18
  5. Réponses: 3
    Dernier message: 13/09/2008, 19h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo