Bonjour,
J'ai écrit une application Qt qui affiche une grille (Board) composée de cellules (Cell). Tout s'affiche comme je veux mais j'ai plusieurs problèmes.
1. Lorsque je ferme la fenêtre, l'application plante. J'ai mis l'appel à la classe Board en commentaire (donc ma grille ne s'affiche plus) et là, plus de problème de crash à la fermeture.
2. Lorsque l'on clique sur une cellule, un petit menu (QMenu) apparaît et l'on peut choisir un chiffre et la cellule se met alors à jour. Mais lorsque je clique sur la cellule, et que je clique à côté (le menu apparaît puis disparaît), l'application plante aussi.
Ma fenêtre principale
Ma classe Board
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 #include "gui2.h" GUI2::GUI2(QWidget *parent) : QMainWindow(parent), ui(new Ui::GUI2Class) { ui->setupUi(this); Test t(9); b = new Board(t, parent); //Board * b setCentralWidget(b); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } GUI2::~GUI2() { delete b; delete ui; }
Et le bout de code qui affiche le petit menu
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 #include "Board.hpp" Board::Board(Test t, QWidget *parent) : QWidget(parent), t(t) { //Cell * cell QGridLayout * layout = new QGridLayout; int i = 0, j = 0; while (i < this->t.size()) { while (j < this->t.size()) { if (this->sudo.getROnly()[i][j] != 0) { cell = new Cell(i,j, this->t.get(i, j), this->t.size(), true); } else { cell = new Cell(i,j, this->t.get(i, j), this->t.size()); } layout->addWidget(cell, i, j); j++; } j = 0; i++; } layout->setSpacing(0); this->setLayout(layout); } Board::~Board() { delete cell; }
Ce que j'ai remarqué dans ce dernier, c'est qu'il me crée à chaque fois un nouveau menu, laissant l'autre en mémoire.
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 void Cell::popup(const QPoint& pt) { QPoint global = this->mapToGlobal(pt); QMenu pPopup(this); for (int i = 1; i <= sizez; i++) { QAction * act = new QAction(QString::number(i), this); act->setData(i); pPopup.addAction(act); } //connect(pPopup, SIGNAL(triggered()), this, SLOT(setValue())); QAction* pItem = pPopup.exec(global); //Pas de connect après car exec renvoie déjà l'élément triggered setValue(pItem); }
Je ne suis pas encore très familier avec la gestion de la mémoire sous Qt même si j'ai déjà lu quelques articles là dessus.
Merci pour votre aide![]()
Partager