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 :

Transformation directe d'un QGraphicsItem


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 Transformation directe d'un QGraphicsItem
    Bonjour,
    ça fait plusieurs jours que je tourne en rond à essayer de résoudre ce problème. J'ai un QGraphicsView/Scene qui affiche des images. J'aimerais -à la façon de gimp, photoshop ou tout autre logiciel de traitement d'image- créer une sorte d'armature autour de l'image pour redimensionner ou pivoter l'image.

    J'ai essayé beaucoup de combinaison mais aucun satisfaisante. J'aimerais si possible créer deux vues imbriquées, celle qui est imbriquée afficherait les images, tandis que la plus "haute" afficherais des information tels que l'armature en question (ou alors un rectangle de séléction, des règles, etc...).

    Ma question: comment pourrais-je faire l'armature autour de l'image? Ou alors quels idées auriez-vous a me suggerer, parce que là, je bloque...

    Merci d'avance.

    ps: seul code source qui n'ai pas vraiment changé depuis le début:

    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
    GraphicsView::GraphicsView(QWidget *parent)
        : QGraphicsView(parent)
    {
        setScene(new QGraphicsScene);
        m_layers_view = new QGraphicsView(new QGraphicsScene); //m_layers_view qui est la vue imbriquée
        scene()->addWidget(m_layers_view);
     
        m_layers_view->scene()->setBackgroundBrush(QPixmap("./Ressources/damier.png"));
     
        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        setViewport(new QGLWidget);
        setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
        m_layers_view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
    }
    ps2: la difficulté étant en autre d'arriver à position des item (l'armature) autour d'un autre item qui se dans une autre scene...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Salut,

    Pourquoi ne pas tout faire dans une même vue ? Enfin, si tu en utilises deux fais en sorte que les deux QGraphicsView et QGraphicsScenes aient les même geometry() pour qu'elles soient pile superposées et donc aient les même repères. Et pour ce qui est de l'armature autour de l'image, ajoute un QGraphicsRectItem* à ta scene avec scene()->addRect(...) un peu plus grand que ton image et un peu décalé pour que les bords dépassent et fait en sorte que quand tu cliques sur ce rectangle, l'image (ainsi que le rectangle) soient redimensionnés/pivotés/... suivant la commande.

    G.

  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
    Citation Envoyé par gluttony Voir le message
    et fait en sorte que quand tu cliques sur ce rectangle, l'image (ainsi que le rectangle) soient redimensionnés/pivotés/... suivant la commande.

    G.
    Tu survole et minimise la difficulté de cette partie . Bon, cela dit j'ai réussi a mettre quatre items autour de l'image, et en les bougeant ça redimenssione bien. Mais je suis pas top top satisfait.

    Pourquoi deux vues? Exemple: ctrl+roulette permet de (dé)zoomer sur la vue. Lors de cette opération les items aparaissent plus grand. Ca fait pas sérieux lorsque l'armature en question s'agrandit ou diminue également (on voit donc des éléments censés êtres virtuels s'agrandir et rapetisser en même temps que l'image). Cela dit, le flag "ItemIgnoresTransformations" arrange ce problème.
    Pour le moment je me contente de ça, mais je dois dire que je suis vraiment pas fan. Autre exemple: si je veux enregistrer en image la scene, j'utilisee "render()" de la scene, faudra pas que j'oublie d'enlever ces informations en trop , ce qui n'est pas grave ni difficile, mais ça me plait pas...

    Pour le moment, c'est vrai que j'ai pas d'autre choix que de me contenter d'une vue, mais je dois passer a coté de quelque chose...

    Merci bien pour la réponse.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par h3llmo Voir le message
    Tu survole et minimise la difficulté de cette partie . Bon, cela dit j'ai réussi a mettre quatre items autour de l'image, et en les bougeant ça redimenssione bien. Mais je suis pas top top satisfait.

    Pourquoi deux vues? Exemple: ctrl+roulette permet de (dé)zoomer sur la vue. Lors de cette opération les items aparaissent plus grand. Ca fait pas sérieux lorsque l'armature en question s'agrandit ou diminue également (on voit donc des éléments censés êtres virtuels s'agrandir et rapetisser en même temps que l'image). Cela dit, le flag "ItemIgnoresTransformations" arrange ce problème.
    Pour le moment je me contente de ça, mais je dois dire que je suis vraiment pas fan. Autre exemple: si je veux enregistrer en image la scene, j'utilisee "render()" de la scene, faudra pas que j'oublie d'enlever ces informations en trop , ce qui n'est pas grave ni difficile, mais ça me plait pas...

    Pour le moment, c'est vrai que j'ai pas d'autre choix que de me contenter d'une vue, mais je dois passer a coté de quelque chose...

    Merci bien pour la réponse.
    Ah ok, je comprend le pourquoi des deux vues, mais pour ma part dans les logiciels que j'ai utilisés (Photoshop et Gimp) quand je zoom, retaille une image, si j'ai une sélection de faite elle est zoomée/mise à jour dyamiquement. Après c'est clair que je comprend mieux pour l'enregitrement, mais tu dois pouvoir faire un hide sur tes items virtuels (en les flaguant, par exemple avec setObjectName("virtual"), et les cacher tous avant de sauvegarder).

    Sinon je viens de penser à une chose, simplement donner le focus à l'image en question: Qt va automatiquement encadrer l'item qui a le focus. Et avec un setStyleSheet tu dois pouvoir modifier l'apparence de cet encadre si tu veux.

    G.

Discussions similaires

  1. [SVN] Transformer projet en dépôt directement
    Par Tristan Zwingelstein dans le forum Eclipse
    Réponses: 1
    Dernier message: 05/06/2013, 14h11
  2. Réponses: 1
    Dernier message: 14/08/2012, 17h44
  3. [Graphics View] transformer un QGraphicsItem lors d'un zoom
    Par sebmag dans le forum Débuter
    Réponses: 1
    Dernier message: 16/09/2010, 14h41
  4. Transformée de Hough, direction du gradient
    Par Dävid dans le forum OpenCV
    Réponses: 4
    Dernier message: 26/07/2010, 10h40
  5. Direct linear transformation sur un ensemble de points
    Par snipemi dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 08/04/2010, 23h44

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