2016-06-19 1 views
3

친구가 Qt를 사용하여 C++로 게임을 만들려고합니다. 런타임 중에 액세스하려면 QMap에 몇 가지 QGraphicsTextItem을 저장하고 싶습니다. 여기에 코드의 관련 부분을 붙여 넣었습니다. 문제는 프로그램이 응답하지 않는다는 것입니다. 우리의QMap을 사용하여 객체를 저장할 때 응용 프로그램이 응답을 멈 춥니 다.

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 

없음 ++ 또는 Qt는 C를 사용하여 많은 경험이 없으며, 우리는 어떤 도움을 주셔서 감사합니다.

답변

2

코드 스 니펫에 일부 코드가 누락되어 있지 않으면 QMap이 올바르게 사용되지 않습니다. 아직 QMap 항목을 할당하지 않았습니까? 따라서 범위를 벗어난 요소에 액세스하고 있습니다 (즉, 아직 존재하지 않음).

이 같은 (Qt는 페이지에서 촬영)는 삽입을 (사용할 수있는 QMap)에 항목을 추가하려면 :

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

다시 밖으로 당신의 가치를 읽을 :

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

당신이 돈을 '이 t은 루프하지만 코드를 당신이 할 수있는 사용하여 반복해야합니다

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

노트

같은 키를 가진 항목을 삽입 할 경우, 그렇지 않으면 당신은 그냥 키 값을 덮어 쓰게됩니다 예를 들어, insertMulti(...)를 사용해야합니다 : 여기

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

, map[1]는 "TEST2"를 반환합니다 . 하지만 플레이어가 모두 고유 한 인덱스가 될 것이기 때문에 이것이 당신이 원하는 것이라고 생각하지 않습니다 ... 그러나 같은 인덱스를 가진 이 값을 그냥 덮어 씁니다.

+3

실제로 [연산자]()'를 사용하여 (http://doc.qt.io/qt-5/qmap.html#details) 항목을'QMap '에 삽입 할 수 있습니다. – thuga

+0

@thuga 예, ref를 위해 +1, 나는 더 잘 어울리는 결정을 내릴 수 없다. insert는 새로운 값을 추가 할 때 더 "정확하다"는 것처럼 보이지만, 연산자 []()는 기존 값을 수정할 때 더 "정확하다" 나는 그들을 사용하는 경향이 있지만 ... (사실을 알지 못해서) 그들은 둘 다 똑같은 짓을한다. 비록 그들이 동일한지를보기 위해 어셈블리를 보지 않았지만. –

+1

[]를 사용하면 위험 할 수 있습니다. 존재하지 않을 경우 항목을 추가하기 때문에 위험 할 수 있습니다. 그게 내가 일반적으로 대부분의 시간을 피하는 이유입니다. – thuga

관련 문제