Bonjour,

J'ai cherché en vain comment résoudre ce problème, mais j'ai du mal à me résoudre à utiliser une solution que je trouve "moins propre".

Voilà, j'ai une classe "game" héritant de QGraphicsView dans laquelle je créé la scene.
J'ai une seconde classe "unit" qui elle hérite de QGraphicsItem. J'ajoute des units à ma scene.

Mon objectif est de stocker (ou pointer vers) l'unité sur laquelle je clic. (afin de pouvoir appeler ses méthodes sur d'autres clics).

J'utilise une fonction "MousePressEvent" dans unit pour détecter le clic dessus et par là modifier la valeur de "SelectedUnit" dans "game".

J'ai isolé le problème avec des Qdebugs, j'arrive pien à entrer dans une fonction de "game" depuis "unit" mais dès que je veux accéder à une variable (même en lecture seule) le programme crash.

Voici mon code :
game.h
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
 
 
class Game : public QGraphicsView
{
    Q_OBJECT
public:
    Game(QWidget *parent = NULL);
 
    void SetSelection (Unit * unit);
 
    void mousePressEvent(QMouseEvent *event);
 
    QGraphicsScene * scene;
    Unit * SelectedUnit;
};
game.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
 
Game::Game(QWidget *parent):QGraphicsView(parent){
    // create the scene
    scene = new QGraphicsScene();
 
        scene->setSceneRect(0,0,800,600);
        setScene (scene);
 
        Unit* unit = new Unit();
        unit->setPos(100,200);
        scene->addItem(unit);
}
 
void Game::mousePressEvent (QMouseEvent *event)
{
        SelectedUnit->SetPos (event->Pos()); // Par exemple
}
 
void Game::SetSelection (Unit *unit)
{
    qDebug() << "Set Selection appelé depuis :" << unit ;
      // Ici le unit s'affiche correctement signe que ce n'est pas le this qui ne se transmet pas.
    SelectedUnit = unit; // là le programme crash
    return;
}
Unit.h

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
class Unit: public QObject, public QGraphicsRectItem {
        Q_OBJECT
public :
    Unit(QGraphicsItem * parent = NULL);
 
    void mousePressEvent(QGraphicsSceneMouseEvent  *event);
 
public slots:
   void moveforward();
};
Unit.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
 
extern Game * game;
 
Unit::Unit(QGraphicsItem *parent){
 
    setRect(0,0,50,50);
}
 
void Unit::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    setBrush(Qt::red);
    qDebug() << "Unité Cliquée";
    game->SetSelection (this);
    }
    return;
}
Par contre l'inverse fonctionne parfaitement, d'appeler des fonctions de Unit depuis Game. Il doit y avoir un truc que j'ai pas compris avec les pointeurs.

Si quelqu'un peut m'expliquer je serais vraiment reconnaissant.

Merci beaucoup d'avance.

Bien cordialement,

Arthur