我有一个无处可寻的问题。我有一个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:
problemsList.value(selProblem):
行后
problemsList.insert(selProblem, nProblem);
selProb: 0
nProblem:
problemsList.value(selProblem):
编辑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
};
答案 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 类中遇到过这个问题,这就是为什么我怀疑这可能是那个问题。感谢所有帮助过的人!