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 :

Comment gérer des intersections dans QGraphicsItem::paint()

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

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut Comment gérer des intersections dans QGraphicsItem::paint()
    Bonjour à tous,

    Suite à un premier problème concernant QPainter et QGraphicsItem :

    http://www.developpez.net/forums/d97...qgraphicsitem/

    Je reviens vers vos précieux conseils cette fois ci pour vous questionner sur l'utilisation de certaines fonctions dans la réimplémentation de QGraphicsItem::paint() !

    Pour ceux ou celles qui n'ont pas suivi ces posts, je souhaite gérer les intersections des lignes puis colorier l'intérieur de la figure géométrique formée par ces lignes suivant les intersections ! (voir le lien ci-dessus).

    J'ai donc réimplémenté paint() suivant les indications de yan (que je remercie au passage) et je me retrouve face à un autre problème et ne connaissant pas encore bien ces classes, je vous laisse deviner la suite !

    Comment gérer ces croisements de lignes ? Sachant que chaque ligne est un nouveau QGraphicsPolygonItem perso ! Dois-je réimplémenter la fonction dans mes QGraphicsPolygonItem perso ?

    Voici ce que j'ai déjà fait ! Après je bloque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Ligne::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        if(painter->hasClipping())// je ne sais pas si c'est la bonne méthode ?!
        {
            // là je bloque !!!
        }
     
        QGraphicsPolygonItem::paint(painter,option,widget);
    }
    Ligne étant mon QGraphicsPolygonItem perso !

    Merci d'avance pour vos lumières

    Il y a une image de ce que je souhaite ici (sans les lignes qui dépassent !) :

    Nom : 259669.jpg
Affichages : 188
Taille : 21,8 Ko

  2. #2
    Membre averti

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Points : 356
    Points
    356
    Par défaut
    Bonjour,

    peut être que la fonction "collidesWithItem" peut aider...

    A partir de ton item, tu dois pouvoir récupérer la scene, puis les autres items.
    En parcourant tous les items pour les tester avec la fonction "collidesWithItem' ça devrait le faire.
    Enfin je suppose...

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    J'aurais plutôt imaginé un seule item qui permet de bouger,/ajouter/enlever les points de ta figure.
    Pour faire simplement les trous dans la figure, je te conseil de regarder cette exemple :
    http://qt.developpez.com/doc/latest/demos-composition/
    A mon avis la composition clear ou destout devrais être intéressante.

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

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par yan Voir le message
    J'aurais plutôt imaginé un seule item qui permet de bouger,/ajouter/enlever les points de ta figure.
    Merci yan ! que veux-tu dire par un seul item ?

    Car j'ai essayé de changer ma classe "Ligne" (qui hérite de QGraphicsLineItem) en "MyItem" (qui hérite de QGraphicsItem) ! Car avec cette classe je peux tout dessiner (cercle, courbe, ligne) dans un seul item, mais ça ne réagit pas comme je le souhaite. La fonction fillPath() me donnait ce que je souhaitais et je croyais avoir trouver la solution, mais je ne sais pas comment interagir avec les signaux de la souris pour envoyer les coordonnées du dessin dans la méthode paint() ! Je pense que cette classe est la solution à mon problème mais je n'en suis pas certain à 100%.

    J'ai aussi essayé de réimplémenter QGraphicsPathItem et je n'y arrive pas non plus.

    Ce que je retiens de positif c'est cette fonction QPainter::fillPath().

    Sinon, j'en suis toujours au même point ! C'est un peu galère.

    Voici quand même où j'en suis :
    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
    void MyGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
    {
        QPen pen;
        pen.setWidth(0);
        pen.setColor(Qt::white);
        pen.setStyle(Qt::SolidLine);
     
        painter->setPen(pen);
     
        QPainterPath p;//pour les lignes !
     
    //ESSAI DESSIN D'UNE PLATINE************************************************************************
     
        p.lineTo(0,0);//point d'origine !
        p.lineTo(100,0);
        p.lineTo(100,100);
        p.lineTo(0,100);
        p.lineTo(0,0);//retour au point d'origine !
     
        p.addEllipse(QPoint(20,20),7,7);
        p.addEllipse(QPoint(80,80),7,7);
        p.addEllipse(QPoint(20,80),7,7);
        p.addEllipse(QPoint(80,20),7,7);
     
    //FIN DE L'ESSAI************************************************************************************
     
        painter->fillPath(p,QBrush(Qt::green,Qt::Dense7Pattern));//Remplissage de l'intérieur du chemin
     
        painter->drawEllipse(QPoint(0,0),5,5);
        painter->drawPath(p);
     
    }

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

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    Bon ben c'est toujours la galère !

    Comme je dessine en temps réel, je souhaites envoyer les coordonnées de la souris vers la méthode paint() de ma classe MyItem (qui hérite de QGraphicsItem). Je n'arrive pas à mettre tout ça en place. Je dois m'y prendre sûrement mal !!! Pour ce qui est de récupérer les coordonnées, il n'y a pas de problèmes. Le seul souci c'est de les envoyer dans ma méthode paint().

    Dois-je d'abord créer un conteneur (membre de MyItem) qui contiendrait toutes les coordonnées de mon dessin et qui se mettrait à jour à chaque ajout ou retrait de point ?

    J'avoue que je patauge dans la soupe là

    Quelqu'un à une idée ?

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par sebmag Voir le message
    Dois-je d'abord créer un conteneur (membre de MyItem) qui contiendrait toutes les coordonnées de mon dessin et qui se mettrait à jour à chaque ajout ou retrait de point ?
    A mon avis oui. Et tu devras surement faire du traitement pour connaitre tes intersections.
    Le paint ne sert qu'à afficher et à rien d'autre. A mon avis il te faudrait découper les choses. Le pattern model-view-programming (MVC à la Qt) est une bonne approche
    http://qt.developpez.com/doc/latest/...w-programming/
    En gros :
    * Model : contient les info (point, intersection,...) et les méthodes de manipulation. C'est le code métier.
    * View Programming : utilise les info de ton model pour le paint et connect tes interactions IHM avec la manipulation de ton model.

Discussions similaires

  1. Comment gérer des fichier dans une BD MySQL
    Par helpcomm dans le forum MySQL
    Réponses: 1
    Dernier message: 30/01/2010, 23h05
  2. [AC-2007] Comment gérer des conditions dans un champ texte de formulaire?
    Par glooping dans le forum IHM
    Réponses: 17
    Dernier message: 28/07/2009, 18h05
  3. comment gérer des images dans la balise TD?
    Par sebac dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/05/2009, 11h51
  4. Comment gérer des mp3 dans une animation flash ?
    Par jonglo-sapiens dans le forum Flash
    Réponses: 3
    Dernier message: 03/01/2008, 10h01
  5. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09

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