Bonsoir...
Je développais une petite extension pour le framework GraphicsView de Qt pour fournir des gizmos (comme ceux des logiciels de créa 3D), et vu que QtQuick est bien parti pour en être un remplaçant, autant ne pas resté ancré dans le passé. Je porte donc le tout sous QML.
Je m'arrache les cheveux sur un problème (qui semble) tout simple. J'arrête donc et je m'en remets à vous
J'utilise une classe C++ "QuickTranslateGizmo" qui dérive de QQuickPaintedItem pour le gizmo, que j'enregistre dans un plugin QML. Mon fichier de test ressemble à cela :
A terme je souhaite que le développeur n'aie même pas à fixer la taille et encore moins la position du gizmo depuis le QML. Pour la taille, je pense que c'est possible en utilisant un setProperty ou équivalent depuis la classe C++, vous confirmez ?
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 Item { id: b width: 100 height: 100 x: 50 y: 50 TranslateGizmo { width: 150 height: 150 manipulatedItem: b currentConstraint: TranslateGizmo.xyPlane } }
Enfin...le problème principal, c'est celui que vous pouvez voir sur la capture ci-dessous. Je n'arrive pas à centrer mon gizmo dans son item parent. Je souhaite juste que leurs centres respectifs coïncident, et je souhaite le faire depuis la classe C++ (donc pas d'utilisation d'anchors). Pour la version GraphicsView, c'était facile, un setPosition() et c'était bon. Mais là, j'ai beau retourner le problème dans tous les sens, je ne vois pas.
Je précise que je n'ai pas utilisé QQuickItem::setPosition() directement : je suis bien passé par un setProperty comme le demande la doc.
J'ai aussi tenté un mapToScene, cela n'a aucun effet...
Voici la capture :
En bleu, le boundingRect de l'item auquel est appliqué le gizmo. En son centre, vous pouvez voir que j'affiche le centre de son boundingRect ainsi que sa position.
J'ai fais de même avec le gizmo, cette fois en noir. Sa position est indiquée à l'origine de son parent. Et là je ne comprends pas comment faire en sorte que "le centre du bounding rect (que vous voyez en dessous) ne coïncide avec sa position".
Ci-dessous la capture après avoir déplacé le gizmo à la position de son parent avec :
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // QuickTranslateGizmo.cpp // 'manipulated' est l'item auquel est appliqué le gizmo QPointF manipulatedCenter = manipulated->boundingRect().center(); setProperty("x", manipulatedCenter.x()); setProperty("y", manipulatedCenter.y());
En une phrase, je souhaite que le centre (des boundingRect, donc) de l'item et du gizmo soit le même...
Si vous avez des pistes, des conseils, je suis preneur...
Merci !
Partager