使用QMap存储对象时,应用程序停止响应

时间:2016-06-19 16:38:49

标签: c++ qt qmap qgraphicstextitem

我的一个朋友和我正在尝试使用Qt在C ++中制作游戏。我们希望在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的经验,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

除非您在代码段中遗漏了一些代码,否则您的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]将返回&#34; test2&#34;。但是我不认为这是你想要的,因为你的玩家都将成为我认为的唯一索引......但是值得注明的是insert()具有相同的索引只会覆盖该值。