Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Zoom centré sur le curseur

Bonsoir tout le monde,

Voici un projet exemple qui implémente une fonctionnalité de zoom centré sur le curseur, que bon nombre de logiciels font (logiciels de cartographie par exemple), mais qu'il faut généralement implémenter "à la main" dans son programme. Il y a également peu d'exemples clairs là dessus sur la toile (ou je n'ai pas bien cherché :D )

Le code est entièrement QML, pas de C++, pas de compilation. Il s'ouvre avec QtCréator. Il utilise QtQuick 2.0, mais QtQuick 1.0 fonctionnera tout aussi bien.
Dans le zip il y a une image avec quelques explications sur papier, c'est mon brouillon en fait.

Fichier : CenteredZoom.zip


Quelques explications :
Tout le travail tient sur les trois lignes suivantes :

x = (x - xPos)*scaleValue + xPos
y = (y - yPos)*scaleValue + yPos
scale *= scaleValue
xPos et yPox sont les positions x;y du curseur, scaleValue le facteur de zoom (en relatif, càd facteur en plus depuis le dernier zoom), x et y les positions du rectangle qui est "zoomé". scale est le facteur d'échelle du rectangle (pas en relatif cette fois).

Pour faire un zoom centré sur le curseur, il faut faire un zoom "normal", centré sur l'origine (0;0) et décaler les objets de l'offset (position souris*facteur zoom relatif - position souris) pour replacer le centre du zoom (qui a été décalé) sur la position voulu (celle du curseur).
C'est tout con, mais il faut faire attention aux facteurs de zoom (relatif/absolu) et à l'origine de la position curseur... sinon tout part en cacahuète :P

Enjoy ;)

Réponses

  • Bonsoir,

    Merci d'avoir partagé.
    Attention tout de même à l'utilisation de pixelDelta qui ne fonctionne pas sur toutes les plateformes. C'est plus fiable d'utiliser angleDelta à la place.
    Donc remplacer :

    var z = wheel.pixelDelta.y
    par :

    var z = wheel.angleDelta.y
    @+
  • Sinon si on souhaite combiner les deux :

    var z = wheel.pixelDelta.y
    if((z == 0) && (wheel.pixelDelta.x == 0)) {
    z = wheel.angleDelta.y;
    }
  • Exact, merci d'avoir relevé.
    On peut d'ailleurs n'utiliser que angleDelta, même en utilisant un trackpad "haute précision" comme sur Mac OS. Surtout qu'ici on ne prend pas en compte la valeur mais juste le signe. On peut prendre la valeur en compte si on souhaite gérer l'accélération (pour zoomer plus vite) et/ou les différences entre les périphériques.
Connectez-vous ou Inscrivez-vous pour répondre.