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 :

[explications] boudingRect() et paint()


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Points : 16
    Points
    16
    Par défaut boudingRect() et paint()
    bonjour,

    décidément je n'arrive pas à comprendre à quoi servent exactement ces deux fonctions.

    je les ai "implémenté" dans ma classe (abstraite) dérivée de QGraphicsObject mais je n'y fait rien de particulier.

    paint() ne fait rien du tout. et boudingRect renvoi un QrectF censé représenter la position et la taille de l'objet-image affiché.
    mais quand j'affiche le rectangle de paint() avec drawRect(boudingRect()), il ne se trouve pas au bon endroit. et sa taille est fausse.

    j'ai passé en paramètre du constructeur 2 variables qui initialisent mPos et mArea, respectivement des QPointF pour la position et la taille de mes objets afin de m'en servir pour ces 2 fonctions.

    vous faîtes comment vous ?

  2. #2
    Membre averti

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Points : 398
    Points
    398
    Par défaut
    un qgraphicsItem possède son propre système de coordonées et une position dans le système de coordonnées de la scene.

    Exemple : si ton tu positionnes ton item en (10, 10) via qqch du style item->setPos(10, 10), c'est tout le repère de ton item qui bouge. Donc ensuite si dans le paint de ton item tu dessine un QRect(5, 5, 20, 20) tu vas dessiner dans la scene un rectangle qui sera en position (15, 15) et qui aura une taille 20x20.

    Cela explique-t-il le fait que ton rectangle n'est pas au bon endroit ?

  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
    Salut,

    Alors pour faire bref, la méthode paint() est la méthode appelée lorsqu ton graphicsItem doit être repeint (souvent quand il reçoit un update). C'est donc dans cette méthode que tu définis ce qui doit être déssiné (donc c'est là que tu fais des drawRect(), etc.).

    La méthode boudingRect(), comme son nom l'indique, doit retourner le rectangle qui englobe ton item. Cette méthode est souvent utilisée pour restreindre la zone à repeindre à la zone qui a changée (par exemple si tu as 10 items dans ta scène, et qu'un seul change de couleur, il n'est pas forcément utile de repeindre les 9 qui sont restés identiques.) Cette fonction doit donc retourné un rectangle. Ce rectangle est représenté en coordonées relative à ton item (et non en coordonées de la scène). En gros la position [0,0] correspond au centre de ton item (ou plus précisément au point qui représente la position de ton item). Donc si tu veux retourner un carré centré sur ton item, il faut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return QRectF(-10,-10,20,20);
    Bien sûr si tu changes la position de ton item, la position de ce carré va bouger par rapport au référentiel de la scène.

    J'éspère que c'est un peu plus clair. Le mieux est de faire des essais, tu comprendras plus vite.

    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    alors là merci

    je n'avais pas compris ça.
    maintenant la boudingRect() est parfait, lorsque je fait un drawRect dans paint(), ça encadre parfaitement mes objets.

    mais je ne comprends pas l'utilité de paint(). Je ne veux pas de rectangles qui entourent mes objets.
    du coup je ne fais que déclarer paint() et je ne met rien dedans.
    alors quelle utilité ?
    j'imagine que ce sera utile pour la gestion des collisions mais...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Avec tout ça j'ai un peu mieux compris le fonctionnement de ces fonctions.

    il me reste quand même une interrogation

    j'ai donc créer une classe abstraite pour créer mes objets graphiques.
    dans cette classe abstraite je défini boudingRect() et paint()
    et j'utilise une autre fonction virtuelle pure : initPixList() qui est définie dans mes classes filles.
    j'utilise également un membre privé QGraphicsPixmapItem mImage.


    donc dans la fonction initPixList() mes classes filles je dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mImage = new QGraphicsPïxmapItem(<premiere image de la position "stand">)
    mImage->setParent(this)
    et c'est grâce à ce setParent(this) que lorsque j'ajoute un objet graphique à ma scène, il est affiché dans la vue.

    mais ce serait pas plutôt avec Qpainter::drawPixmap() que je devrais faire ça ? donc dans la methode paint() ?
    parce que sinon, j'ai rien à faire dans paint().

    pour pas surcharger le post, je met plutôt le lien pour télécharger le projet : http://leszenfoires/jdr, c'est le dernier lien, et les fonctions concernées sont dans GraphicsObject.cpp et Magicienne.cpp

  6. #6
    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
    Dans QGraphicsPixmapItem, la méthode paint() de QGraphicsItem est déjà redéfini (justement par un drawPixmap ou quelquechose qui y ressemble). C'est donc pour cela que ton image est affiché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/

Discussions similaires

  1. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34
  2. pointeurs (explications)
    Par isidore dans le forum C
    Réponses: 4
    Dernier message: 18/04/2003, 10h41
  3. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  4. Recherche code d'un fifo,ou explication
    Par don-diego dans le forum C
    Réponses: 8
    Dernier message: 25/07/2002, 10h26
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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