Приложение перестает отвечать при использовании QMap для хранения объектов

Мой друг и я пытаемся сделать игру на C ++, используя Qt. Мы хотим хранить несколько 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

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

3

Решение

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

Чтобы добавить элементы в QMap, вы можете использовать insert (), например так (взято со страницы 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, но для своего кода вы можете сделать:

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() с тем же индексом просто перезаписывает значение.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]