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 :

Synchronisation entre deux Graphics View [Graphics View]


Sujet :

Qt

  1. #1
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 662
    Points
    662
    Par défaut Synchronisation entre deux Graphics View
    Bonjour tout le monde,

    alors voilà la situation : j'ai une interface qui possède deux Graphics View qui affiche la même chose, c'est à dire qui possède les mêmes QGraphicsObject et à la même place mais pas forcement les mêmes informations encodées à l'intérieur ; mais ce n'est pas le coeur du problème.

    J'ai mis en place un zoom avec l'attribut "AnchorUnderMouse" et la possibilité de se déplacer (translation) après un zoom avec l'attribut "ScrollHandDrag".

    Je peux effectuer cela sur les deux QGraphicsView sans soucis de manière indépendante mais j'aimerais plutôt synchroniser ces transformations. En gros lorsque je zoom ou translate sur un des QGraphicsView, cela se répercute sur l'autre, de telle sorte que l'on visualise toujours la même zone sur les deux QGraphicsView.

    Pour cela j'ai mis un système de slot/signal pour communiquer entre les deux QGraphicsView qui à l'air de fonctionner => lors d'un changement d'un QGraphicsView j'envoie "quelque chose dont je ne sais pas encore la nature" à l'autre QGraphicsView pour qu'il applique ce même changement.

    J'ai dans un premier temps envoyé la matrice QTransform que je récupère à l'aide de la méthode QTransform QGraphicsView::transform(); et sur l'autre j'applique la QTransform reçu à l'aide de la méthode void QGraphicsView::setTransform ( const QTransform & matrix, bool combine = false );

    Cela implique que le zoom se fait bien de manière synchro mais malheureusement pas avec le même centre => pour la QGraphicsView où se fait réellement le zoom, le centre est sous la souris, par contre pour l'autre c'est le milieu de la QGraphicsView.

    De plus la translation n'est pas du tout synchronisé...

    Donc les questions sont les suivantes :
    1. Comment synchroniser complètement le zoom et donc avoir le même centre ?
    2. Comment faire pour que la translation soit aussi pris en compte dans la synchronisation ?

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Salut

    La matrice de transformation est appliquée directement sur les coordonnées des éléments dans le scène pour calculer les coordonnées dans la vue. Il n'y a pas de notion de centre (la notion de centre intervient quand tu fais un rotation ou un zoom par exemple, donc des coordonnées d'un vue dans une vue... je sais pas si c'est clair)

    Peut être plus un problème avec l'alignement automatique ou le mode (je sais plus la propriété, par défaut, le vue affiche tous les items). Comment initialises tu tes vues ? Tu as un ou plusieurs scènes ? Comment fais tu ton zoom ?

  3. #3
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 662
    Points
    662
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Peut être plus un problème avec l'alignement automatique ou le mode (je sais plus la propriété, par défaut, le vue affiche tous les items). Comment initialises tu tes vues ? Tu as un ou plusieurs scènes ? Comment fais tu ton zoom ?
    C'est deux scènes différentes. Sinon au départ ça ressemble à l'exemple de Qt : http://qt-project.org/doc/qt-4.8/demos-chip.html

    Pour l'instant, j'ai presqu'une synchro avec le zoom en récupérant le viewportTransform avec la méthode viewportTransform() et le point où pointe la souris avec event->pos() ; j'envoie à l'autre vue ces données et je fais un
    centerOn(mapToScene(pointpointéparlasouris));
    setTransform(latransformation, false);

    ça donne un résultat un peu mieux mais loin d'être satisfaisant.

    Pour ce qui est de mon zoom, je fais à l'aidre de la touche ctrl+wheel =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    void BoloMatrix::wheelEvent(QWheelEvent* event)
    {
      if (event->modifiers() & Qt::ControlModifier) {
        if (event->delta() > 0) zoomIn(6);
        else zoomOut(6);
     
        event->accept();
      }
     
      else
        QGraphicsView::wheelEvent(event);
    }
     
    void BoloMatrix::zoomIn(int level)
    {
      m_zoom += level;
      setupMatrix();
     
      emit(syncView(viewportTransform(), m_lastPosition, m_zoom));
    }
     
    void BoloMatrix::zoomOut(int level)
    {
      m_zoom -= level;
      if (m_zoom < 0) m_zoom = 0;
      setupMatrix();
     
      emit(syncView(viewportTransform(), m_lastPosition, m_zoom));
    }
     
    void BoloMatrix::setupMatrix()
    {
      if (QGraphicsScene* sc = scene())
        fitInView(sc->sceneRect(), Qt::KeepAspectRatio);
     
      QMatrix matrix;
     
      if (m_rotationAngle != 0)
        matrix.rotate(m_rotationAngle);
     
      qreal scale = qPow(qreal(2), m_zoom / qreal(30));
      matrix.scale(scale, scale);
     
      setMatrix(matrix, true);
    }
    ce qui ressemble à l'exemple Qt de ce point de vue et j'ai mis la valeur "QGraphicsView::AnchorUnderMouse" pour l'attribut transformationAnchor de sorte que le zoom se dirige vers le pointeur de la souris.

    EDIT : j'avais oublié une fonction peut être intéressante. Ajouté avec les autres.

  4. #4
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 662
    Points
    662
    Par défaut
    J'ai finalement résolu mon affaire en récupérant la position des ScrollBar (que je n'affiche pas mais qui reste active apparemment) pour synchroniser la position exact et du même coup ça fonctionne super bien pour la translation

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

Discussions similaires

  1. [Q] Synchronisation entre deux bases
    Par knoll dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/03/2008, 14h23
  2. Synchronisation entre deux fichiers
    Par Chronax dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 11/10/2007, 01h52
  3. Drag and Drop entre deux list view
    Par mkaffel dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/10/2007, 22h52
  4. [2005] Synchronisation entre deux bases
    Par mister3957 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/08/2007, 13h46
  5. synchronisation entre deux threads
    Par chabfive dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 03/11/2006, 13h17

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