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

Discussion :

transformer un QGraphicsItem lors d'un zoom [Graphics View]

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Par défaut transformer un QGraphicsItem lors d'un zoom
    Bonjour,

    Tout est dans le titre ! Est-ce que quelqu'un parmis vous à déjà eu ce problème ? J'explique :

    - J'ai une classe "Ligne" qui hérite de QPolygonItem.
    - J'ai une autre classe "Dessin" dans laquelle je gère une QGraphicsView perso et une QGraphicsScene perso aussi !
    - Dans la classe "Dessin" j'ai créer une fonction zoom() qui applique des scale() à la vue !

    Jusque là pas de problème ! Enfin, il y en a eu mais ils ont été résolu !

    Donc, lors d'un zoom avant, Les items grossissent (logique !) et lors d'un zoom arrière c'est l'inverse.

    Ce que je souhaite, c'est que lorsque je zoom (avant ou arrière) les items grossissent ou rétressissent tout en gardant la MEME épaisseur de ligne !

    Dans le constructeur de ma classe "Ligne", j'applique à un QPen : un setWidth(1) !

    Est-ce que la classe "QTransform" peut faire l'affaire ? Si oui, comment faire pour l'utiliser ?

    voici ma fonction zoom :
    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
    // SLOT private : zoom avec la molette
    void Dessin::zoom(int delta)
    {
        if(m_iZoom >= -5 && m_iZoom <= 5 && delta >= 0)
        {
            if(m_iZoom == 5)
            {
                return;
            }
            ++m_iZoom;
     
            m_vue->scale(1.5,1.5);
            m_vue->update();
            m_scu->scale(1/1.5,1/1.5);
            scuPos();
            m_scu->update();
        }
        else if(m_iZoom <= 5 && m_iZoom >= -5 && delta <= -1)
        {
            if(m_iZoom == -5)
            {
                return;
            }
            --m_iZoom;
     
            m_vue->scale(1/1.5,1/1.5);
            m_vue->update();
            m_scu->scale(1.5,1.5);
            scuPos();
            m_scu->update();
        }
        else
        {
            return;
        }
    }
    voici ma classe "Ligne" :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #include "ligne.h"
    #include <math.h>
     
    Ligne::Ligne(QGraphicsItem *parent) :
            QGraphicsPolygonItem(parent)
    {
        m_nom = "ligne";
        setFlags(QGraphicsItem::ItemIsSelectable);
        setAcceptHoverEvents(true);
        setAcceptedMouseButtons(Qt::LeftButton);
     
        m_pen.setJoinStyle(Qt::RoundJoin);
        m_pen.setCapStyle(Qt::RoundCap);
        m_pen.setWidth(1);
        m_pen.setColor(Qt::white);
        setPen(m_pen);
    }
     
    Ligne::Ligne(const QPolygonF &polygon, QGraphicsItem *parent) :
            QGraphicsPolygonItem(polygon, parent)
    {
        m_nom = "ligne";
        setFlags(QGraphicsItem::ItemIsSelectable);
        setAcceptHoverEvents(true);
        setAcceptedMouseButtons(Qt::LeftButton);
     
        m_pen.setJoinStyle(Qt::RoundJoin);
        m_pen.setCapStyle(Qt::RoundCap);
        m_pen.setWidth(1);
        m_pen.setColor(Qt::white);
        setPen(m_pen);
    }
     
    Ligne::~Ligne()
    {
     
    }
    // Fonction protected réimplémenté : Modifie la couleur de la ligne lors du passage de la souris
    void Ligne::hoverEnterEvent(QGraphicsSceneHoverEvent * event)
    {
        m_pen.setColor(Qt::red);
        m_pen.setWidth(1);
        m_pen.setJoinStyle(Qt::RoundJoin);
        m_pen.setCapStyle(Qt::RoundCap);
        setPen(m_pen);
        update();
     
        QRectF rec = boundingRect();// récupère les dimensions !
    //Calcul de la longueur de la ligne*****************************************************************
        double longueur = rec.width();
        double largeur = rec.height();
        longueur = round(longueur);
        largeur = round(largeur);
        double tot = (longueur*longueur) + (largeur*largeur);
        double result = sqrt(tot);
        result *= 10;
        result = round(result)/10;
    //Fin du calcul de la longueur**********************************************************************
     
    //Calcul de l'angle d'inclinaison de la ligne*******************************************************
        double total;
        if(longueur == 1)
        {
            longueur = 0;
        }
        total = longueur/result;
     
        double angle = acos(total);
        angle = angle*(180/M_PI);// Convertion radians en degrés (M_PI est une constante de math.h)
    //Fin du calcul de l'angle**************************************************************************
     
    //Affichage des résultats dans l'infobulle**********************************************************
        QString nombre;
        QString a;
        nombre.setNum(result);
        a.setNum(angle,'f',1);
        setToolTip("Longueur : " + nombre + " mm.\nAngle : " + a + "°.");
    //Fin de l'affichage********************************************************************************
     
        QGraphicsPolygonItem::hoverEnterEvent(event);
    }
    // Fonction protected réimplémenté : Modifie la couleur de la ligne lorsque la souris n'est plus au-dessus
    void Ligne::hoverLeaveEvent(QGraphicsSceneHoverEvent * event)
    {
        m_pen.setColor(Qt::white);
        m_pen.setWidth(1);
        m_pen.setJoinStyle(Qt::RoundJoin);
        m_pen.setCapStyle(Qt::RoundCap);
        setPen(m_pen);
        update();
        QGraphicsPolygonItem::hoverLeaveEvent(event);
    }
    // Fonction public : retourne le nom de l'item (nom = "ligne")
    QString Ligne::getNom() const
    {
        QString n = m_nom;
        return n;
    }
     
    void Ligne::mousePressEvent(QGraphicsSceneMouseEvent *event)
    {
        if(this->isSelected())
        {
            // Code à venir...
        }
     
        QGraphicsPolygonItem::mousePressEvent(event);
    }
    Merci par avance !

  2. #2
    Membre confirmé Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Par défaut
    Bon, du coup le problème à été résolu !

    j'ai mis setRenderHints(QPainter::NonCosmeticDefaultPen); dans ma classe "Vue" et tous les penWidth à 0 dans ma classe "Ligne" !

    Merci quand même !

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

Discussions similaires

  1. [WD16] Conserver la distance entre deux champs image lors d'un Zoom
    Par wojc01 dans le forum WinDev
    Réponses: 1
    Dernier message: 14/11/2011, 08h39
  2. Image SVG coupée lors d'un zoom
    Par Pitus dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/04/2011, 18h14
  3. canvas : mauvaise coordonnées lors d'un zoom
    Par jackRackham dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 24/03/2011, 14h19
  4. Adaptation de la taille d'un plot lors d'un zoom
    Par MathildeJ dans le forum MATLAB
    Réponses: 3
    Dernier message: 28/06/2010, 16h50
  5. Réponses: 2
    Dernier message: 03/03/2007, 19h16

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