将For循环的i转换为QString

时间:2012-09-26 09:43:18

标签: c++ qt

编辑 -

在这里,我被摔倒了:

for(int i=0, a=bugModel->rowCount(); i<a; i++){
        qDebug() << i;
        QString *BugName = new QString(QString::number(i));
        setting.beginGroup(BugName->toAscii());
        bugModel->setData(bugModel->index(i,0), setting.value("theBugName",  "A Bug!").toString());
        setting.endGroup();
        delete BugName;
    }

我尝试从设置组加载名称并将其设置为列表模型,其名称将等于i。但每次我加载模型时,该组的信息都会被输入。只显示,因为我在这里是0。例如:

我有两个名为&#39; 0&#39;和&#39; 1&#39;。我希望for循环运行2次,以便从这些组加载值并在QListView中设置它。但我测试了它,每次只加载&#39; 0&#39;组,当我将其更改为for(int i=1..)时,它会加载组的值&#39; 1&#39;。

2 个答案:

答案 0 :(得分:1)

要修复第一种情况,您可以(*BugName) = QString::number(i)BugName->setNum(i);,但更大的问题是您想要实现的目标以及如何检查它是否保持为零?你期望改变什么?也许给出更多背景?

答案 1 :(得分:0)

基于对'a'的奇怪使用,我猜测还有一堆你没有发布的其他代码。现在看来,循环等价于for (int i = 0; i < 2; ++i),因此只迭代i = 0和i = 1。在第一次传递时,它创建一个新的QString,将地址分配给bugname指针,然后尝试(错误地)为其分配一个字符串。您可以将第二行更改为*BugName = QString::number(i);,它应该可以正常工作。更好的是,您可以使用其中一个QString构造函数并将第一行更改为QString* BugName = new QString(QString::number(i))并完全消除第二行。

现在第二个问题,你的内存泄漏。在第一次传递之后,循环重置并创建第二个qstring,用新地址覆盖bugname。不幸的是,这个孤儿是你造成泄漏的第一个qstring。在循环结束前添加行delete BugName;进行修复。如果你真的试图在循环之后创建一个'BugNames'数组,你可能想要使用一个数组:在循环之前放置QString BugNames[2],然后使用循环迭代并单独初始化它们通过BugNames[i] = QString::number[i]。由于数组是自动变量,因此后一种情况不需要delete部分。

修改 看看你修改过的代码,我会这样做(虽然老方法仍然有效):

for(int i=0; i < bugModel->rowCount(); i++){
  qDebug() << i;
  QString BugName = QString::number(i);
  setting.beginGroup(BugName.toAscii());
  bugModel->setData(bugModel->index(i,0), setting.value("theBugName",  "A Bug!").toString());
  setting.endGroup();
}

请注意,使用'a'是多余的,因为编译器可能会删除它(实际上是循环本身)。现在我看到你正在做什么,我完全抛弃指针字符串,只使用一个自动变量。至于它不工作的问题,qDebug应输出“0 1”,是吗?您可以在qDebug() << BugName;分配后尝试::number,但我怀疑它也会输出“0 1”。这意味着你的真正问题在于begin/endGroup()函数中,而不是在这个循环中。如果beginGroup的参数被赋值给静态的东西,你可能会用第二遍覆盖一个值。