Bonjour à tous
Dans mon application j'ai à afficher #255000 points représentés par une icone.
Dans un cas, je prends un fichier .bmp de 32x32 pixels et j'ai une charge en mémoire de 162 Mo pour tous ces points.
Dans un second cas, je crée l’icône à partir d'un QPixmap, d'une taille de 38x38 pixels, car j'y rajoute un texte de 1 à 5 caractères. La mémoire est alors saturée pour finir par une erreur d'allocation tellement ça déborde de partout.
Voici le code de création de l'icône :
elle est appelée par ce code :
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 QPixmap GenIcone::wayPoint(QString code) { QPixmap *pm = new QPixmap(38,38); pm->fill(Qt::transparent); QPainter *pmp = new QPainter(pm); pmp->setRenderHint(QPainter::Antialiasing); pmp->setBrush(Qt::cyan); pmp->setPen(Qt::black); static const QPoint triangle[3] = { QPoint(15,0), QPoint(3, 20), QPoint(27,20) }; pmp->drawPolygon(triangle, 3); pmp->setFont(QFont("ArialBold",12)); pmp->drawText(1,32,code); pmp->end(); return *pm; }
Aurais-je oublié de fermer/supprimer quelque chose ou y a-t-il une si grande différence d'utilisation mémoire entre les deux façons de procéder ?
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
33 //Parser du fichier Waypoints QTextStream in(&file); while(!in.atEnd()) { QString line = in.readLine(); QStringList fields = line.split(","); //Création du point et ajout au calque //********************************************* //Structure du fichier Waypoints //Col0 = CODE (1 à 5 CHAR) //Col1 = LATITUDE //Col2 = LONGITUDE //Col3 = PAYS (2 CHAR null si rien) //********************************************* QString str = fields.at(1); double latitude = str.toDouble(); str = fields.at(2); double longitude = str.toDouble(); str = fields.at(0); // Choix de l'icone //icone = new QPixmap(QCoreApplication::applicationDirPath() + "/Images/Point.bmp"); icone = new QPixmap(GenIcone::wayPoint(str)); Point* pointCourant = new Point(longitude, latitude, *icone, str); waypoints->addGeometry(pointCourant); } file.close();
Merci pour votre aide.
Partager