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

24
在C#中,只需要简单地编写以下代码:
listBox1.Items.Add("Hello");
listBox1.Items.Add("There");

foreach (string item in listBox1.Items )
{
    MessageBox.Show(item.ToString());
}

我可以轻松地将不同的对象添加到列表框中,然后使用foreach检索它们。

我尝试在Qt 4.8.2中采用相同的方法,但似乎它们是不同的。尽管它们在第一眼看起来非常相似。我发现Qt支持foreach,所以我继续尝试了一些东西:

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

这个明显失败了。它说items()需要一个参数,这让我很困惑。我试图遍历ListBox本身,那这是什么意思呢?我尝试将ListBox对象作为参数传递,但这也再次失败了:

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

以下是我的问题:

  • 如何在Qt中迭代QListWidget项目?
  • 我可以像C#一样将对象存储为QListWidgets中的项目吗?
  • 如何将QListWidgets中的对象转换为字符串(与C#的ToString相似)?

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

3个回答

49

我认为items函数并不是你想要的功能。它听起来像是用于解码MIME数据,而不是获取小部件中所有项目的列表。

很遗憾,我实际上没有看到能够完全满足你要求的函数。但是,你可以使用findItems作为一种解决方法,但这似乎有些丑陋,甚至可能是不合适的...至少你仍然可以使用旧式的for循环和item函数 - 它们的输入量并不会太多:

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

希望这能有所帮助!


4
谢谢您的留言。不幸的是,Qt决定创建一个items类方法,它不像其他开发库中的items类方法一样返回QListWidgetItems的集合,这令人困惑和笨拙。我的意思是,为什么Qt会在foreach()上自夸,但却没有提供一种用它来迭代该小部件的子项的方法呢? - Volomike

5
你可以像这样做:

你可以这样做:

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

2

如果您正在使用代码创建列表项,请尝试为每个项目创建一个指针。但是,如果您正在使用.ui文件创建列表项,请右键单击它并点击编辑样式表。这样可以非常轻松地进行编辑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接