Qt QMap <int,myclass =“”>忽略插入命令

时间:2018-03-27 14:34:05

标签: qt insert qmap

我有一个无处可寻的问题。我有一个QMap,它忽略 QMap.insert(Key,Value)命令。这是代码:

    //gets the selected problem index on the ProblemList
    int selProblem = ui->tree_projects->currentItem()->data(0, Qt::UserRole).toInt();

    //creates a new problem, sets its values and then replaces the old one on the ProblemsList variable
    ProblemSets nProblem;
    if(!problemsList.isEmpty()) //problemsList is an attribute of MainWindow
        nProblem = problemsList.value(selProblem);

    // some data collection that has been omitted because isn't important

    // temporary maps that will carry the modifications
    QMap<int, QString> nResName, nResType;

    //data insertion into the maps
    //these are fine
    nResName.insert(fIdx, results_model->data(results_model->index(fIdx, 0)).toString());
    nResType.insert(fIdx, results_model->data(results_model->index(fIdx, 1)).toString());

    //replaces the old maps with the new ones
    nProblem.SetProbResultsNames(nResName);
    nProblem.SetProbResultsTypes(nResType);

    //replaces the old problem with the new one
    problemsList.insert(selProblem, nProblem); //this is the line that's doing nothing

}

最后一行似乎什么也没做!我甚至试图使用

problemsList.remove(selProblem);
problemList.insert(selProblem, nProblem);

但得到了类似的结果:地图未插入索引 selProblem 。它已插入,但带有过时的值 - 与删除的索引相同 - 。我已经检查了Debug并且所有索引和变量都是正确的,但是当 .insert 命中时,没有任何反应。

最尴尬的是,这段代码是我用另一种方法制作的复制/粘贴,我使用的方法做类似的事情,只是更改变量名称,但是那个有效。

编辑1:这是 nProblem selProb 的内容 problemsList.value(selProblem)

就在线前:

problemsList.insert(selProblem, nProblem);

selProb: 0

nProblem:

  • ProbResultsNames:&#34; NewRow0&#34;
  • ProbResultsType:&#34; Real&#34;

problemsList.value(selProblem):

  • ProbResultsNames:不存在
  • ProbResultsType:不存在

行后

problemsList.insert(selProblem, nProblem);

selProb: 0

nProblem:

  • ProbResultsNames:&#34; NewRow0&#34;
  • ProbResultsType:&#34; Real&#34;

problemsList.value(selProblem):

  • ProbResultsNames:不存在
  • ProbResultsType:不存在

编辑2:

class ProblemSets
{

public:
    ProblemSets();
    virtual ~ProblemSets();
    ProblemSets(const ProblemSets& other);
    ProblemSets& operator=(const ProblemSets& other);

//I hid getters and setters to avoid pollution on the post

private:
    int index;
    bool usingBenchmark;
    QString functionSelected;
    QString info;
    QMap<int, QString> probVars_name, probVars_type, probResultsNames, probResultsTypes;
    QMap<int, float> probVars_min, probVars_max;
    QMap<int, int> probVars_stpSize, probVars_stp;

    int varsNumber; // holds how many vars has been created, just for display purposes
    int resNumber; // holds how many results has been created, just for display purposes

};

2 个答案:

答案 0 :(得分:1)

一个简单的测试证明QMap按预期工作:

  QMap<int, QString> mm;
  mm.insert(1, "Test1");
  qDebug() << mm[1]; // "Test1"
  mm.remove(1);
  qDebug() << mm[1]; // "" (default constructed value)
  mm.insert(1, "Test2");
  qDebug() << mm[1]; // "Test2"

这意味着问题出在您的代码中。

这句话本身非常可疑:

  

最后一行似乎什么也没做!

因为那时你继续说地图仍然包含&#34;旧值&#34;。但是您删除了该密钥,因此如果insert()方法不起作用,则您不应该获取旧值,而是默认构造值。

这意味着问题很可能是nProblem与先前与地图中该关键字关联的值具有相同的值。地图有效,你的价值可能是错误的。

答案 1 :(得分:1)

发现问题!我没有在 ProblemSets 类的复制方法中声明这两个变量。

解决了简单地将它们添加到复制方法

MainWindow::ProblemSets::ProblemSets(const ProblemSets& other)
{
    // copy
    index = other.index;
    usingBenchmark = other.usingBenchmark;
    functionSelected = other.functionSelected;
    info = other.info;
    probVars_name = other.probVars_name;
    probVars_type = other.probVars_type;
    probVars_min = other.probVars_min;
    probVars_max = other.probVars_max;
    probVars_stpSize = other.probVars_stpSize;
    probVars_stp = other.probVars_stp;
    //here
    probResultsNames = other.probResultsNames;
    probResultsTypes = other.probResultsTypes;
    //
    varsNumber = other.varsNumber;
    resNumber = other.resNumber;
}

我之前在 std :: vector 类中遇到过这个问题,这就是为什么我怀疑这可能是那个问题。感谢所有帮助过的人!