Qt foreach() 仅迭代一次,忽略其余项目

Posted

技术标签:

【中文标题】Qt foreach() 仅迭代一次,忽略其余项目【英文标题】:Qt foreach() only iterates once, ignoring the rest of the items 【发布时间】:2020-08-21 10:28:28 【问题描述】:

我正在尝试向旧的 Qt4 应用程序添加一些功能,而且我是 Qt 的新手。该应用程序使用foreach 关键字,我相信它是implemented by Qt。然而,应用程序中的所有 foreach 循环只运行一次,而与容器中的项目数量无关。

我将此健全性检查添加到应用程序中:

QString test("1234");

int i = 0;
foreach (QChar c, test) 
    i++;


int stl = 0;
for (QString::iterator j = test.begin(); j != test.end(); j++) 
    stl++;


qDebug()
    << "string:" << test
    << "size:" << test.size()
    << "foreach:" << i
    << "stl:" << stl
;

它总是显示这条消息:

string: "1234" size: 4 foreach: 1 stl: 4

我已经用上面的QStringQModelIndexList 对其进行了测试,每次它只运行一次循环,即使容器报告有多个项目,并且在这两种情况下都是 STL 风格的循环工作正常,只有foreach 提前退出循环。

我做错了什么?该应用程序是针对 Qt 4.8.7 构建的。

【问题讨论】:

【参考方案1】:

为了记录,事实证明这是 GCC 9 (bug report) 的行为变化,与 break; 语句应该出现的位置以及它们的作用有关。

9 之前的 GCC 版本似乎做错了事,但 Qt 4 是围绕这种行为编写的,所以一旦在 GCC 9 中得到修复,Qt 的 foreach 循环就会中断。

它在最近的 Qt 版本中是 looks like it has been addressed,但不幸的是在 Qt 4 中没有。

【讨论】:

以上是关于Qt foreach() 仅迭代一次,忽略其余项目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 仅验证已发布的项目并忽略验证数组的其余部分

如何仅执行 qgraphicsitem 的 mouseevent ? (忽略 qgraphicsview 的其余 mouseevent)

Qt在迭代时从QMultiHash中删除项目

java foreach 跳过第一次迭代

foreach 循环,判断哪个是循环的最后一次迭代

使用setTimeout跳转到(Typescript).forEach循环中的下一次迭代