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 :

Dupliquer un QGraphicsItemGroup

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut Dupliquer un QGraphicsItemGroup
    Bonjour,

    j'ai un QGraphicsItemGroup dans une QGraphicsScene.

    je voudrais dupliquer ce item n fois ( n est une entrée)

    j'ai fait comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QGraphicsItemGroup *it= new QGraphicsItemGroup;
    it=maGroupe;
    it->setPos(maGroupe->pos()+QPoint(100,100));
    maScene->addItem(it);
    et j'ai ça en sortie:
    QGraphicsScene::addItem: item has already been added to this scene
    quelqu'un a une idée?
    Merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    C'est normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QGraphicsItemGroup *it= new QGraphicsItemGroup;
    Tu crées un nouveau QGraphicsItemGroup
    Tu affectes à it l'adresse de maGroupe, mais ce n'est plus le QGraphicsItemGroup que tu viens de créer (et sur lequel tu as perdu toute référence au passage... avec comme conséquence une belle fuite mémoire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t->setPos(maGroupe->pos()+QPoint(100,100));
    tu modifies maGroupe, même si tu ne t'en rends pas compte
    Tu essayes d'ajouter it, mais it, c'est maGroupe...

    Cherchez l'erreur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 308
    Par défaut
    Sur certains objets, tu as une méthode copy ( exemple QImage::copy ), ce n'est pas le cas pour un QGraphicsItemGroup

    Il te faut parcourir le QGraphicsItemGroup de façon à lister les items, puis créer un nouveau groupe et affecter à ce groupe les éléments.

    Info à vérifier : un item peut t'il faire partie de 2 groupes ? pas sûr, un item n'a qu'un seul parent pour moi.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Normalement, un item ne doit faire partie que d'un seul groupe.

    Ce qui me mène à une question : pourquoi voudrais tu dupliquer un QGraphicsItemGroup

    Es-tu sur que tu ne veux pas, tout simplement, créer un QGraphicsItemGroup qui contienne un certains nombre d'éléments (bien connus) reliés entre eux

    Si c'est là ton besoin, ce que tu devrais peut être envisager, c'est de créer une nouvelle classe (dérivée de QGraphicsItemGroup) dont le constructeur créerais tous les éléments en question et, simplement créer des objets de ce type à chaque fois que tu en as besoin
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    j'ai aucune idée comment faire?

    un peux d'aide please

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Ben, de manière tout à fait classique, avec un héritage public de QGraphicsItemGroup

    En gros, cela pourrait prendre une forme de
    MyGraphicGroup.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MyGraphicGroup : public QGraphicsItemGroup {
    public:
        MyGraphicGroup(QGraphicsItem * parent = 0);
    };
    MyGraphicGroup.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MyGraphicGroup::MyGraphicGroup(QGraphicsItem * parent):
                     QGraphicsItemGroup(parent){
        /* ici, tu crées les différents éléments que tu veux
         * rajouter à ton groupe et tu les ajoutes avec la fonction
         * addToGroup(QGraphicsItem * item)
         */
    }
    Après, il y a peut être d'autres choses à faire, mais ca, ca dépendra de tes propres besoins
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    j'ai écris une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     class MonMacro:public QGraphicsItemGroup
    dans laquelle j'ai definis mes items(lines - cercles ... )
    comme vous avez dit

    mais lors j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
       MonMacro *macro=new MonMacro;
       maScene->addItem(macro);
     
       MonMacro *macro1=new MonMacro;
       maScene->addItem(macro1);

    un seul a la fois s'affiche !!!

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Ce que tu peux faire, je crois, c'est de bloquer les signaux (avec la fonction blockSignals(true); )au niveau de la vue pour qu'elle n'essaye pas de se tracer à chaque fois qu'elle est modifiée, le temps de rajouter tous les éléments.

    Une fois que tous les éléments ont été rajoutés à la vue, tu débloques les signaux (avec la fonction blockSignals(false); ) de la vue et tu invoques update() pour rafraichir ta vue d'une seule traite
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 26/01/2006, 08h44
  2. [SAP]dupliquer une base
    Par bgeli dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 11/01/2005, 21h04
  3. Dupliquer une structure de table
    Par deviltaz dans le forum Access
    Réponses: 4
    Dernier message: 13/10/2004, 13h41
  4. Conteneurs associatifs à clés dupliquées
    Par Christophe Brun dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 04/07/2004, 14h16
  5. [FLASH MX 2004] Dupliquer un clip dans un autre clip
    Par freegreg dans le forum Flash
    Réponses: 15
    Dernier message: 28/05/2004, 15h28

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