我如何迭代QListWidget项目并处理每个项目?

Rik*_*ika 16 c++ qt qlistwidget

在CSharp中,它就像写作一样简单:

listBox1.Items.Add("Hello");
listBox1.Items.Add("There");

foreach (string item in listBox1.Items )
{
    MessageBox.Show(item.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我可以轻松地将不同的对象添加到列表框中,然后使用foreach检索它们.我在Qt 4.8.2中尝试了相同的方法,但看起来它们是不同的.虽然它们看起来非常相似.我发现Qt支持foreach所以我继续尝试类似于:

foreach(QListWidgetItem& item,ui->listWidget->items())
{
    item.setTextColor(QColor::blue());
}
Run Code Online (Sandbox Code Playgroud)

明显失败了.它说items()需要一个让我困惑的参数.我试图遍历ListBox本身,那么这意味着什么?我尝试传递ListBox对象作为参数本身,这也失败了:

foreach(QListWidgetItem& item,ui->listWidget->items(ui->listWidget))
{
    item.setTextColor(QColor::blue());
}
Run Code Online (Sandbox Code Playgroud)

所以这是我的问题:

  • 如何遍历Qt中的QListWidget项?
  • 我可以将对象存储为QListWidgets中的项目,如C#吗?
  • 如何将QListWidgets中的对象转换为字符串(Qt中的C#s ToString计数器部分)?

(假设我想使用QMessagBox而不是setTextColor,并希望打印出QlistWidget中的所有字符串项.)

Xav*_*olt 35

我不认为项目功能符合您的想法.这听起来像是用于解码MIME数据,而不是获取窗口小部件中所有项目的列表.

遗憾的是,我实际上看不到任何功能可以完全按照你的意愿行事.你也许可以使用findItems作为一种解决方法,但似乎难看,如果不是彻头彻尾的滥用......至少,你仍然可以使用产品功能与良好的老for循环-他们没有更多的打字:

for(int i = 0; i < listWidget->count(); ++i)
{
    QListWidgetItem* item = listWidget->item(i);
    //Do stuff!
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 谢谢你.令人遗憾的是,Qt决定创建一个item类方法,该方法不返回QListWidgetItems的集合,就像人们期望的任何其他开发库的items类方法一样.令人困惑和笨拙.我的意思是,为什么他们甚至没有提供一种方法来迭代这个小部件的子项,为什么吹嘘Qt中的foreach()呢? (4认同)

Thi*_*oel 5

你可以这样做:

for(int i = 0; i < listWidget->count(); ++i)
{
    QString str = listwidget.item(i)->text();
    //Do stuff!
}
Run Code Online (Sandbox Code Playgroud)