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 :

Problème de récupération de QList<QGraphicsItem *> dans une autre classe [Graphics View]

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Problème de récupération de QList<QGraphicsItem *> dans une autre classe
    Bonjour à tous,

    Et Bonne Année à tous.

    C'est la première fois que je poste ici.
    Car j'aime mieux me dépatouiller pour trouver mon problème mais là je coince vraiment et j'ai plus trop le temps (dans moins de 2 semaines je dois rendre ça ^^).

    Je ne sais pas trop si c'est bien dans cette partie ou dans la partie 2D/3D.

    J'ai un projet de 3D (OpenGL) à réaliser (école), c'est une architecture de maison en 3D (avec mon collègue on a vu trop grand ^^).

    J'ai réalisé dans un premier temps les objets en 2D grâce à l'exemple du "Diagram Scene" (lien ici http://qt.developpez.com/doc/4.7/gra...-diagramscene/)

    J'ai fait à ma dose, j'ai fais un drag & drop est ça marche bien. Tous les éléments 2D marchent bien.

    Mon problème:
    Je veux récupérer les éléments2D de ma scène 2D qui est un classe et récupérer cette liste d'élément 2D (avec leurs positions et leurs noms d'éléments) dans une autre classe enfin d'afficher ses éléments en 3D.

    Maintenant je voulais récupérer tous les éléments de ma scene2D.
    Grace à cette fonction, je récupère bien la liste des éléments.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     QList<QGraphicsItem *> Scene2D::Maliste(){
         return items();
     }
    Après je veux la mettre dans une autre classe pour récupérer cette liste d'élément (surtout la position des éléments et le nom de l'élément) afin d'afficher mes éléments en 3D.

    Voici le code complet de mon projet diagramscene.zip (il n'y a pas trop de commentaire pour l'instant).


    Le projet ne sera pas fini, car c'est juste un projet pour l'école, le plus important est que je récupère mes éléments en 2D pour le mettre dans la scène 3D.

    Les fichiers qui faut regarde sont "Scene2D.cpp" et "scene.cpp".

    Voilà Merci pour ceux qui m'aide.

  2. #2
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Plus d'explication

    Ici je récupère bien ma liste de mes éléments de ma scène dans la classe "Scene2D.cpp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QList<QGraphicsItem *> Scene2D::Maliste(){
         return items();
     }
    Enfaite, je veux récupérer cette liste dans ma classe "scene.cpp". Et c'est là le problème

    Explication:
    Je récupère bien ma liste de mes éléments de ma scène quand je suis dans la classe "Scene2D.cpp". Ca pause pas de problème là.
    Mais je veux reprendre cette liste pour la mettre dans une autre classe et c'est là le problème.

    Fichier "scene.h"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .....
    class Scene : public QGLWidget
    {
    ....
    protected:
        .....
        QList<QGraphicsItem *> elem;
        Scene2D *sc;
    ....
    }
    Fichier "scene.cpp"
    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
     
    .....
    void Scene::paintGL()
    {
        //draw scene here
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        gluLookAt(this->_position.x(),this->_position.y(),this->_position.z(),
                          this->_target.x(),this->_target.y(),this->_target.z(),
                          this->_up.x(),this->_up.y(),this->_up.z());
     
        glTranslated(xPos, yPos, zPos);
        glRotatef( xRot, 0, 1, 0 );
     
        //c'est ici que je veux récupérer ma liste des élements 2D pour les afficher en 3D avec leur nom d'élément et leur position
        elem=sc->Maliste();
     
    }
    ....

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour et bienvenue,

    J'aimerai avoir des précision sur le bogue que vous avez. Est-ce un crash ? ou juste que la fonction ne retourne aucun éléments ?
    Si c'est un crash, c'est surement car le pointeur "sc" est invalide.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Salut,

    C'est un crash du programme.

    Je ne vois pas pourquoi ça ne veut pas marcher

    Citation Envoyé par LittleWhite Voir le message
    Bonjour et bienvenue,

    J'aimerai avoir des précision sur le bogue que vous avez. Est-ce un crash ? ou juste que la fonction ne retourne aucun éléments ?
    Si c'est un crash, c'est surement car le pointeur "sc" est invalide.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Utilisez vous QtCreator ? Qu'indique le débogueur ? (lancez le programme compilé en debug, avec votre EDI)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    En Exécution normal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Le programme s'est terminé subitement.
    \diagramscene-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\debug\diagramscene.exe a quitté avec le code -1073741819
    En mode débogage (je ne comprends pas trop quand il marche aussi)
    Nom : 1.jpg
Affichages : 246
Taille : 138,4 Ko

    Puis j'ai fait F11
    Nom : 2.jpg
Affichages : 337
Taille : 161,2 Ko

    Je ne sais pas si c'est bien ça ce que tu veux

    Sinon j'ai passé tous mon projet dans le premier message



    Citation Envoyé par LittleWhite Voir le message
    Utilisez vous QtCreator ? Qu'indique le débogueur ? (lancez le programme compilé en debug, avec votre EDI)

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Pour le moment, ça ne compile pas à cause du fichier d'entête gl.h. Je retesterai ce soir, pour voir si j'arrive à mieux.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu utilises des DLL externes ? Sont-elles visibles par le programme ? Lance-le directement en double-cliquant sur l'exe, tu devrais avoir un message d'erreur plus explicite.

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    Tu utilises des DLL externes ? Sont-elles visibles par le programme ? Lance-le directement en double-cliquant sur l'exe, tu devrais avoir un message d'erreur plus explicite.
    Je n'utilise aucune DLL externes.

    Alors quand je fais un double-clique sur l'exe (dans le dossier debug du projet).
    En rajoutant bien sur les DLL manquant pour lancer l'exe (libgcc_s_dw2-1.dll, mingwm10.dll, QtCored4.dll, QtGuid4.dll, QtOpenGL.dll et QtOpenGLd4.dll).
    Ca m'affiche rien de plus par rapport à Qt.

    Le message d'erreur
    Nom : 3.jpg
Affichages : 390
Taille : 75,2 Ko
    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
    Signature du problème*:
      Nom d’événement de problème:	APPCRASH
      Nom de l’application:	diagramscene.exe
      Version de l’application:	0.0.0.0
      Horodatage de l’application:	4f06ebd4
      Nom du module par défaut:	QtGuid4.dll
      Version du module par défaut:	4.7.4.0
      Horodateur du module par défaut:	4e5523bd
      Code de l’exception:	c0000005
      Décalage de l’exception:	007a4bfa
      Version du système:	6.1.7601.2.1.0.768.3
      Identificateur de paramètres régionaux:	1036
      Information supplémentaire n°*1:	0a9e
      Information supplémentaire n°*2:	0a9e372d3b4ad19135b953a78882e789
      Information supplémentaire n°*3:	0a9e
      Information supplémentaire n°*4:	0a9e372d3b4ad19135b953a78882e789
     
    Lire notre déclaration de confidentialité en ligne*:
      http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x040c
     
    Si la déclaration de confidentialité en ligne n’est pas disponible, lisez la version hors connexion*:
      C:\Windows\system32\fr-FR\erofflps.txt
    ______________________________________________________

    Citation Envoyé par LittleWhite Voir le message
    Pour le moment, ça ne compile pas à cause du fichier d'entête gl.h. Je retesterai ce soir, pour voir si j'arrive à mieux.
    Ok merci.

    Je continue à chercher et à faire des tests

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Je crois que j'ai trouvé mais je ne suis pas sur ^^.

    Alors vois, j'utilise Qt designer pour faire mon interface graphique en image.
    Nom : 9.jpg
Affichages : 532
Taille : 201,4 Ko

    Mon premier exemple que j'ai montré ici

    Je crée un QGraphicsSene (pour la 2D que j'ajoute mes objets 2D) et un QGLwidget (qui me permet d'afficher des objets OpenGL 3D).

    Deuxième exemple que je suis entrain de tester

    Après j'ai tenté autre chose, j'ai créé deux QGraphicsSene (pour la 2D que j'ajoute mes objets 2D et l'autre me permettrai d'afficher ses objets en 3D OpenGL) et ses deux QGraphicsSene je les mets dans un QGraphicsView (un chacun).

    Code qui me permet de mettre un QGraphicsScene dans un QgraphicsView:
    Fichier "Fenetre.cpp"
    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
     
    .... 
    //Partie 3D
    QGLWidget *widget1 = new QGLWidget(QGLFormat(QGL::SampleBuffers));
        widget1->makeCurrent();
     
        Scene2D *glWidget = new Scene2D;
        QGraphicsView *view1 = new QGraphicsView(glWidget);
        view1->setViewport(widget1);
        view1->setAcceptDrops(false);
        view1->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
        view1->setScene(glWidget);
        view1->show();
        ui->cadreopengl->addWidget(view1);//j'affiche dans un QVBoxLayout
     
    //Partie 2D
     
    QGLWidget *widget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
            widget->makeCurrent();
     
            Scene2D *scene = new Scene2D(itemMenu, this);
            view = new QGraphicsView(scene);
            view->setAcceptDrops(true);
            view->setViewport(widget);
            view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
            view->setScene(scene);
            view->show();
            ui->cadreopengl->addWidget(view);//j'affiche dans un QVBoxLayout
    .....
    Et là j'ai testé pour récupérer ma liste.
    J'ai plus d'erreurs déjà, c'est bien mais je ne récupérai pas la liste des éléments de ma scène 2D.

    Après est-ce que c'est bien ça.

    Ensuite normale j'ai une table 3D en opengl (qui est en dur pour voir si ma scène en 3d marche bien avec cette nouvelle solution des 2 QGraphicsSene). et là je ne la vois pas du tous.

    PPPPPPFFFFFFFFFFF.

    Je continue à chercher ^^.

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bon, la boite de message qui est affiché par Windows, cela signifie une erreur de segmentation

    Sinon, j'ai essayé de compilé sous GNU/Linux, mais il me manque le fichier textures.h.

    Comme GNU/Linux est un système sensible à la casse, le fichier "listechoixobjet.h" dans ui_Fenetre.h n'est pas trouvé.
    IL faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Listechoixobjet.h"
    et avec des guillemets car c'est un de vos fichiers et non ceux du systèmes. (Les crochets sont que pour les fichiers systèmes).

    Sous GNU/Linux, je n'ai aucun bug.

    (Remarques sur l'interface:
    Il me semble plus logique de contrôler la caméra de la vue 3D avec la souris.
    La sélection du zoom devrait se faire avec la souris pour la vue 2D (roulette)).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bon, la boite de message qui est affiché par Windows, cela signifie une erreur de segmentation

    Sinon, j'ai essayé de compilé sous GNU/Linux, mais il me manque le fichier textures.h.

    Comme GNU/Linux est un système sensible à la casse, le fichier "listechoixobjet.h" dans ui_Fenetre.h n'est pas trouvé.
    IL faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Listechoixobjet.h"
    et avec des guillemets car c'est un de vos fichiers et non ceux du systèmes. (Les crochets sont que pour les fichiers systèmes).

    Sous GNU/Linux, je n'ai aucun bug.

    (Remarques sur l'interface:
    Il me semble plus logique de contrôler la caméra de la vue 3D avec la souris.
    La sélection du zoom devrait se faire avec la souris pour la vue 2D (roulette)).
    Ah ok merci pour la petite précision ^^ (juste le foutu "L", pppppffffff je crains)

    Je prends note de tes remarques, mais pour l'instant le plus important c'est cette liste que je veux récupérer. (qui me fait )

    J'avance petit à petit mais chaque fois une contrainte de plus.

    je passe la deuxième version de mon projet (je pense que c'est la meilleur solution enfin j'espère ^^)
    projet3D.zip

  13. #13
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Salut,

    J'ai trouvé ça y est, enfaite la 1er et la 2ème solution c'est pareil (enfin en quelque sort ^^)

    La premier je vois bien ma Table en dur que j'ai mis.
    La deuxième je ne la vois pas la table en dur pour l'instant.

    Enfin bon.

    Le problème je chercher du côté de la classe de ma scène 3D mais ce n'était pas là qu'il fallait chercher mais du côté de ma classe "Fenetre.cpp" (Interface Graphique avec Qt Designer) que je devais passer l'information.
    Voilà comment je récupère ma liste de ma Scène 2D à ma Scène 3D.

    Pour la première solution:

    Scene2D.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ....
    public:
    QList<QGraphicsItem *> liste; //récupére les éléments déposer dans ma scène dans cette liste
    ....
    Scene2D.cpp
    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
    ....
     void Scene2D ::dropEvent(QGraphicsSceneDragDropEvent *mouseEvent){
         //qDebug()<<"dropEvent"<<myMode;
         mouseEvent->acceptProposedAction();
         //mouseEvent->accept();
         Dessin *item;
         switch (myMode) {
             case InsertItem:
                 item = new Dessin(myItemType, myItemMenu);
                 item->setBrush(myItemColor);
                 item->setZValue(0);
                 addItem(item);
     
                 item->setPos(mouseEvent->scenePos());
                 emit itemInserted(item);
                 liste.append(item); //insère dans la liste quand je mets les éléments dans la scène
     
                 break;
         default:
             ;
         }
     }
    ....
    scene.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ....
    public:
    QList<QGraphicsItem *> elem;
    ....

    scene.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .....
    void Scene::paintGL()
    {
       .....
        if(elem.size()!=0){
            qDebug()<<elem; //afficher les éléments que j'ai récupèré
        }
    ....
    }
    .....
    Fenetre.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ....
    void Fenetre::on_bouton3D_clicked(){
    .....
        glWidget->elem=scene->liste;
    ......
    }
    ....

    Pour la deuxième solution:
    Pareil sauf c'est tous dans une même classe

    Voilà maintenant je récupère bien mes éléments de ma scène 2D.
    Il me reste à les afficher et là j'ai pas encore fini ^^

    voilà ce que j'affiche quand je récupère ma liste dans ma scène 3D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (QGraphicsItem(this =0x2592640, parent =0x0, pos =QPointF(-186, 82) , z = 0 , flags =  ( ItemIsMovable | ItemIsSelectable | ItemSendsGeometryChanges ) ) )
    Maintenant il me reste plus cas récupère la position de mon objet et son nom.

  14. #14
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Merci pour m'avoir guidé pour arriver jusqu'ici.

    Avec la réponse que j'ai donnée juste avant pour passer un QList<QgraphicsItem*> dans un autre classe (avec une interface graphique fait par Qt Designer).

    Je fais peut-être demander un autre conseil pour la gestion des textures avec Qt que je n'ai pas compris mais je pense que ça dois être dans le forum.

    Merci.

    Mon problème est résolu (enfin un ^^)

    a ++

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/10/2012, 13h49
  2. Réponses: 1
    Dernier message: 24/08/2009, 12h03
  3. Problème thread dans une autre classe
    Par Shypster dans le forum C#
    Réponses: 19
    Dernier message: 06/03/2008, 09h23
  4. Réponses: 5
    Dernier message: 31/05/2007, 19h35
  5. Réponses: 10
    Dernier message: 17/11/2006, 15h20

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