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 :

QScrollArea et zoom intelligent "à la google maps" sur une image


Sujet :

Qt

  1. #1
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut QScrollArea et zoom intelligent "à la google maps" sur une image
    Bonjour tout le monde,

    Dans mon utilisation frénétique de Qt, comme vous l'avez peut-être vu dans un de mes derniers topics, je suis en présence d'une image, affichée dans une QScrollArea. On a la possibilité de zoomer, i.e que l'image devienne plus grande que la QScrollArea, auquel cas les scrollbar entrent en jeu. Jusque là, ok, ça marche. Pour zoomer, je redimensionne simplement l'image à l'intérieur en multipliant largeur et hauteur par un facteur bien précis.

    Pour zoomer, je propose deux choses : utiliser +/- du clavier, ou la molette de la souris.
    Dans tous les cas, quand je zoom, ça ne fait qu'agrandir l'image, sans remettre le "focus" sur la zone sur laquelle était le pointeur de la souris. Or, ça commence à devenir très gênant pour l'utilisation du logiciel.

    J'ai essayé de forcer le scroll etc, mais ça ne scroll rien du tout.

    Quelqu'un aurait-il une illumination pour la méthode à employer pour zoomer intelligemment, i.e en centrant sur l'endroit ou se situait le curseur avant le zoom ?

    Merci pour votre attention et votre temps.

  2. #2
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Tu as essayé de forcer le scroll par quels méthodes?

    ensureVisible() ?
    en récupérant les QScrollBars ?
    Un clavier Azerty en vaut deux.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Ca devrait en effet être possible en forçant le scroll.

    Sinon ,une autre piste est de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPainter->translate(QPoint(positionClickée)-QPoint(centreDeTonWidget))//et appliquer ton facteur de grossissement
    Par contre tu perdras peut être une partie de ton image. Et bien sûr il faut que tu utilises QPainter pour redessiner ton image.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Niak74 Voir le message
    Tu as essayé de forcer le scroll par quels méthodes?

    ensureVisible() ?
    en récupérant les QScrollBars ?
    J'avais essayé ensureVisible et un scroll explicite avec les scrollbars. Ca ne marchait pas

    Citation Envoyé par Gulish Voir le message
    Ca devrait en effet être possible en forçant le scroll.

    Sinon ,une autre piste est de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPainter->translate(QPoint(positionClickée)-QPoint(centreDeTonWidget))//et appliquer ton facteur de grossissement
    Par contre tu perdras peut être une partie de ton image. Et bien sûr il faut que tu utilises QPainter pour redessiner ton image.

    G.
    Je fais comme suit pour dessiner mon image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p.drawImage(0, 0, image.scaled(width(), height()));
    (image étant une QImage biensûr)

    Et le zoom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ImageViewer::zoom(double factor)
    {
    	resize(factor*width(), factor*height());
    	update();
    }
    ImaveViewer, c'est la classe (qui est un widget) qui contient la scrollarea, l'image, etc).

    J'ai du mal à voir comment caser le translate. Puisque l'appel à zoom demande à redessiner, mais ne redessine pas explicitement, puisqu'il faut être dans paintEvent() pour ça.

    Donc j'enregistre la position du curseur lors de la demande de zoom, pour ensuite m'en servir dans paintEvent() comme tu l'as mentionné. J'ai tout bien compris ?

  5. #5
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Je ne sais pas exactement ce que tu veux faire et avoir comme rendu, mais il y a une autre solution, plus longue car il te faudra recoder pas mal de choses, qui consiste à utiliser QGraphics (une vue, une scene, un item contenant ton image et des opération sur l'item comme moveBy, rotate, scale, transform, et compagnie). Tu auras alors de nouvelles possibilités et un rendu plus riche que QScrollArea.

    Mais là encore, tout dépend de ce que tu veux faire.
    Un clavier Azerty en vaut deux.

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Niak74 Voir le message
    Mais là encore, tout dépend de ce que tu veux faire.
    J'aimerais éviter, surtout que je dois pouvoir faire ce que je veux sans passer par QGraphics. J'ai juste besoin de pouvoir zoomer intelligemment là

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Un truc du genre devrait faire l'affaire. Il suffit de sauvegarder la position du click, de faire un translate par la valeur de ce point*zoomFactor, et de redessiner l'image avec une size*zoomFactor.

    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
    //translatePoint est un QPoint, basePix le QPixmap d'origine
    void ImageViewer::mousePressEvent(QMouseEvent *qme){
    	if(qme->buttons()==Qt::LeftButton)
    	{
    		mustZoom=true;
    		translatePoint=QPoint(qme->x(), qme->y());
    	}
     
    	repaint();
    }
     
     
    void ImageViewer::paintEvent(QPaintEvent *qpe)
    {
    	QPainter p(this);
    	if(mustZoom)
    	{
    	p.translate(this->rect().center()-translatePoint*2);//ici le zoom est *2
    	p.drawPixmap(this->pos(),basePix.scaled(this->size()*2));
    	mustZoom=false;
    	}
    	else
    	p.drawPixmap(this->pos(),basePix.scaled(this->size()));
     
    }
    J'ai pas testé, mais je pense pas que ce bout de "pseudo-code soit récursif (zoom successif), mais ça te donne une idée de la démarche. Et je ne sais pas non plus comment ça peut réagir avec une abstractscrollarea.

    Mais voilà l'idée

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  8. #8
    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

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par yan Voir le message
    Ah, c'est +- la méthode de Gulish oui.


  10. #10
    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
    Par défaut
    Citation Envoyé par Alp Voir le message
    Ah, c'est +- la méthode de Gulish oui.

    la difference, c'est que tu ne scale pas une pixmap à chaque paint event

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Bon j'ai obtenu quelque chose de pas trop moche (), seulement, comme je peinds avec un offset, j'ai une partie de l'image qui n'est plus "visualisable" tant qu'on n'a pas dézoomé ou zommé dans sa direction, même pas via le scroll. Et là, vraiment, je ne vois pas comment faire

    Quelqu'un aurait l'idée du siècle ? Même si je doute pouvoir trouver une solution à ceci.

  12. #12
    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
    Par défaut
    Citation Envoyé par Alp Voir le message
    Quelqu'un aurait l'idée du siècle ? Même si je doute pouvoir trouver une solution à ceci.
    A mon avis c'est que tu as une erreur dans tes calculs . Tu es sur que tous tes points sont dans le même repère?

  13. #13
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par yan Voir le message
    A mon avis c'est que tu as une erreur dans tes calculs . Tu es sur que tous tes points sont dans le même repère?
    Euh oui

    Mais le soucis, c'est que je me retrouve avec une partie de l'image en dehors de la scrollarea, histoire de pouvoir centrer sur la zone sur laquelle on a zoomé. Mais du coup, je ne peux pas scroller pour voir la partie "cachée" en question. Et c'est embêtant si le gars s'est loupé quoi, qu'il a cliqué un peu à côté de ce qu'il voulait. Là ou c'est critique, c'est quand on a un facteur zoom qui commence à être assez grand, genre 3, par là.

    Mais dans tous les cas, si je décale le painting via un translate ou des offsets (qui sont équivalents), le scroll n'est plus "synchronisé" avec la position de dessin de l'image.

    Vous voyez ?

  14. #14
    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
    Par défaut
    je capte à quoi te sert cette offset

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par yan Voir le message
    je capte à quoi te sert cette offset
    A ce que lorsque l'on zoom sur une partie de l'image, une fois que l'on a zommé, ce soit cet endroit qui se retrouve au centre de la scrollarea.

  16. #16
    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
    Par défaut
    Citation Envoyé par Alp Voir le message
    A ce que lorsque l'on zoom sur une partie de l'image, une fois que l'on a zommé, ce soit cet endroit qui se retrouve au centre de la scrollarea.
    c'est pas plus simple de calculer la nouvelle position des scrollbar?

  17. #17
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par yan Voir le message
    c'est pas plus simple de calculer la nouvelle position des scrollbar?
    Peu importe, tant que ça marche et que c'est robuste
    Mais quand je voulais forcer le scroll, les scrollbar m'envoyaient ... dans les roses, et ne bougeaient pas d'un poil.

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Tu veux maintenant faire un espèce de drag de ton image avec la souris, c'est ça ? Comme sur toutes les applis genre GoogleMaps ?

    Un cliquer glisser qui déplace c'est ça ? C'est quasiment la même chose que précédemment, sans le zoom factor. Il faut que l'action utilisateur soit différente aussi.

    Je sais qu'avec Qwt, il existe des classes trop bien faites pour faire ça (QwtPlotZoomer, QwtPlotPanner, QwtPlotMagnifier). Tu peux peut être t'en inspirer. Ou alors il te suffit de tout refaire avec Qwt (mettre ton image dans un QwtPlot au lieu d'une QAbstractScrollArea).

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  19. #19
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Tu veux maintenant faire un espèce de drag de ton image avec la souris, c'est ça ? Comme sur toutes les applis genre GoogleMaps ?

    Un cliquer glisser qui déplace c'est ça ? C'est quasiment la même chose que précédemment, sans le zoom factor. Il faut que l'action utilisateur soit différente aussi.
    Non non. C'est toujours le même truc qu'au début
    Il y a des cas ou il se comporte bizarrement le zoom intelligent.

    Citation Envoyé par Gulish Voir le message
    Je sais qu'avec Qwt, il existe des classes trop bien faites pour faire ça (QwtPlotZoomer, QwtPlotPanner, QwtPlotMagnifier). Tu peux peut être t'en inspirer. Ou alors il te suffit de tout refaire avec Qwt (mettre ton image dans un QwtPlot au lieu d'une QAbstractScrollArea).
    G.
    Ca peut être une piste très intéressante, d'autant plus que j'utilise Qwt dans le projet déjà.


Discussions similaires

  1. Pb de projection de google map hybride sur mobile
    Par christian.bleau dans le forum IGN API Géoportail
    Réponses: 6
    Dernier message: 01/03/2014, 12h09
  2. google maps api v2 et image qui bouge
    Par Batos dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 03/07/2013, 05h12
  3. Google maps API dans une application Web
    Par charleydc5 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 21/06/2010, 11h26
  4. Geolocalisation sur une image type google map
    Par James_ dans le forum LabVIEW
    Réponses: 3
    Dernier message: 09/02/2010, 09h52
  5. Google map - Déplacement en cliquant sur une image
    Par Laurelaie dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 06/05/2008, 15h53

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