将For循环的i转换为QString

Convert i of For Loop to QString

本文关键字:转换 QString For 循环      更新时间:2023-10-16

已编辑-

这就是我被抛弃的地方:

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"answers"1"的设置组。我希望for循环运行2次,这样它就可以从这些组中加载值,并在QListView中进行设置。但我对它进行了测试,每次它只加载"0"组的值,当我将其更改为for(int i=1..)时,它加载组"1"的值。

要修复第一种情况,您可以使用(*BugName) = QString::number(i)BugName->setNum(i);,但更大的问题是您试图实现什么,以及如何检查它是否保持为零?你希望改变什么?也许可以提供更多的上下文?

基于"a"的奇怪用法,我猜还有很多其他代码你没有发布。现在,循环等价于for (int i = 0; i < 2; ++i),因此只在i=0和i=1之间迭代。在第一次传递时,它创建一个新的QString,将地址分配给错误名称指针,然后尝试(错误地)将字符串分配给它。您可以将第二行更改为*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",是吗?您可以在分配::number之后尝试qDebug() << BugName;,但我怀疑它也会输出"0 1"。这意味着真正的问题在begin/endGroup()函数中,而不是在这个循环中。如果beginGroup的参数被分配给了静态的东西,那么您可能会用第二次传递覆盖一个值