2016-06-19 11 views
3

Ein Freund von mir und ich versuchen, ein Spiel in C++ mit Qt zu erstellen. Wir möchten einige QGraphicsTextItem in einem QMap speichern, um während der Laufzeit darauf zuzugreifen. Ich habe die relevanten Teile unseres Codes hier eingefügt, und unser Problem ist, dass das Programm nicht mehr reagiert.Anwendung reagiert nicht mehr, wenn QMap zum Speichern von Objekten verwendet wird

Game.cpp

int players = 6; 

QGraphicsRectItem * overviewBox = new QGraphicsRectItem(); 
overviewBox->setRect(0, 0, 782, 686); 
scene->addItem(overviewBox); 

for(int i = 1; i <= players; i++) { 
    Container * ovContainer = new Container(overviewBox); 
    ovContainer->Overview(i, faceNo); 
    ovContainer->setPos(0, 0 + 110 * (i - 1)); 

    info->textBoxMap[i-1] = ovContainer->textBox->playerText; // Program stops responding here 
} 

GameInfo.h

#ifndef GAMEINFO_H 
#define GAMEINFO_H 


#include "TextBox.h" 
#include <QMap> 

class GameInfo { 
public: 
    GameInfo(); 

    QMap<int, QGraphicsTextItem *> textBoxMap; 
}; 

#endif // GAMEINFO_H 

Keiner von uns haben viel Erfahrung mit C++ oder Qt, und wir würden jede Hilfe dankbar.

Antwort

2

Wenn Sie keinen Code in Ihrem Code-Snippet verpassen, wird Ihr QMap nicht korrekt verwendet. Ich denke, du hast noch keine QMap Items zugewiesen (eingefügt)? - Sie greifen daher auf ein Element zu, das außerhalb des Bereichs liegt (d. h. noch nicht existiert).

Um Artikel in den QMap fügen Sie insert(), wie dies (aus Qt Seite) verwenden können:

QString str = map[1]; 
//or 
QString str2 = map.value(5); 

Sie don:

QMap<int, QString> map; 
map.insert(1, "one"); 
map.insert(5, "five"); 
map.insert(10, "ten"); 

Dann wieder aus Ihren Wert zu lesen ‚müssen t mit einer for-Schleife zu durchlaufen, aber für Ihren Code könnten Sie tun:

for(int i = 1; i <= players; i++) 
{ 
     : 
     : 
    info->textBoxMap.insert(i, ovContainer->textBox->playerText); 
} 

Note

Wenn Sie Artikel mit dem gleichen Schlüssel einzufügen Sie müssen insertMulti(...) verwenden, sonst werden Sie nur den Wert des Schlüssels überschreiben, zB:

QMap<int, QString> map; 
map.insert(1, "test1"); 
map.insert(1, "test2"); 

Hier map[1] will return „test2“ . Aber ich glaube nicht, dass dies das ist, was Sie wollen, da Ihre Spieler alle einzigartige Indizes sein werden, die ich annehme ... aber es lohnt sich darauf hinzuweisen, dass insert() mit dem gleichen Index den Wert einfach überschreibt.

+3

Eigentlich können Sie [operator []() 'zum Einfügen] (http://doc.qt.io/qt-5/qmap.html#details) Elemente in' QMap' verwenden. – thuga

+0

@thuga ja +1 für die ref, ich kann nie entscheiden, welche besser aussieht ... einfügen scheint mehr "korrekt", wenn ein neuer Wert hinzugefügt wird, operator []() scheint mehr "korrekt" beim Ändern eines vorhandenen Wertes und das ist wie Ich neige dazu, sie zu benutzen ... aber tatsächlich (wie Sie sich entzogen haben) machen beide das gleiche, obwohl ich die Versammlung nicht angeschaut habe, um zu sehen, ob sie identisch sind. –

+1

Die Verwendung von [] kann gefährlich sein, da Elemente hinzugefügt werden, wenn sie nicht vorhanden sind. Deshalb vermeide ich es meistens die meiste Zeit. – thuga

Verwandte Themen