2016-06-19 14 views
3

Мой друг и я пытаемся создать игру на C++ с помощью Qt. Мы хотим сохранить несколько QGraphicsTextItem в QMap для доступа к ним во время выполнения. Здесь я вставил соответствующие части нашего кода, и наша проблема заключается в том, что программа перестает отвечать на запросы.Приложение перестает отвечать при использовании 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 

Никто из нас не имеют большого опыта работы с использованием C++ или Qt, и мы будем благодарны за любую помощь.

ответ

2

Если вам не хватает кода в фрагменте кода, то ваш QMap используется неправильно. Я думаю, вы еще не выделили (вставили) какие-либо элементы QMap? - поэтому вы получаете доступ к элементу, который находится за пределами допустимого диапазона (т. е. еще не существует).

Для добавления элементов в QMap вы можете использовать вставку(), как это (взяты из Qt страницы):

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); 

Вы надеваете «т нужно перебирать, используя для цикла, но и для вашего кода вы можете сделать:

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» , Но я не думаю, что это то, что вы хотите, так как ваши игроки все будут уникальными индексами, которые я предполагаю ... но его ценность указывает, что insert() с тем же индексом просто переписывает значение.

+3

На самом деле вы можете [использовать 'operator []()' to insert] (http://doc.qt.io/qt-5/qmap.html#details) элементы в 'QMap'. – thuga

+0

@thuga yes +1 для ref, я не могу решить, какой выглядит лучше ... insert добавляет новое значение, добавляет новое значение, оператор []() кажется более «правильным» при изменении существующего значения, и вот как Я обычно использую их ... но на самом деле (как вы ускользали) они оба делают то же самое, хотя я не смотрел на сборку, чтобы увидеть, идентичны ли они. –

+1

Использование [] может быть опасным, поскольку оно добавляет элементы, если они не существуют. Вот почему я обычно избегаю этого большую часть времени. – thuga

 Смежные вопросы

  • Нет связанных вопросов^_^