0

编辑——

这就是我被抛弃的地方:

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'的信息只显示出来,因为我在这里是0。例如:

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

4

2 回答 2

1

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

于 2012-09-26T09:46:44.763 回答
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被分配给静态的东西,你可能会用第二遍覆盖一个值。

于 2012-09-26T10:05:54.047 回答