“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第4篇文章,点击查看活动详情”
前言
在使用QListWidget时,有时并不想只用QListWidgetItem作为我们的显示效果,需要将QListWidgetItem设置为我们自定义的一个Widget,并且需要进行添加和删除的操作。QListWidget提供了两个很相似的移除item的方法,removeItemWidget(),一个是takeItem()。在选择这两个方法时产生了疑问,不知道该用哪个,怎么用。于是查阅了官方帮助和网上资料做对比,总结一下这两个方法的区别。
官方解释
- addItem(QListWidgetItem *item): 将项插入到列表小部件的末尾。
- insertItem(int row, QListWidgetItem *item): 将item插入到列表中按行给定的位置。
- setItemWidget(QListWidgetItem *item, QWidget *widget): 设置小部件显示在给定项中。
这个函数应该只用于在指定列表小部件item的位置显示自定义静态内容。如果您想显示自定义动态内容或实现自定义编辑器小部件,请使用QListView和子类QStyledItemDelegate。 - ListWidgetItem *QListWidget::takeItem(int row): 从列表小部件的给定行中移除并返回item;否则返回nullptr。从列表小部件中删除的项目将不会由Qt管理,需要手动删除。
- removeItemWidget(QListWidgetItem *item): 删除在给定项上设置的小部件。removeItemWidget只是删除该item对应的widget,不会删除该item。要从列表中完全删除一个item(row),可以delete该item或使用takeItem()。
简单使用
首先看添加:
QListWidgetItem *item = new QListWidgetItem(); //创建一个item
item->setFlags(Qt::NoItemFlags); //设置item的标志
item->setFlags(Qt::ItemIsEnabled);
item->setSizeHint(QSize(width, height)); //设置item的大小
ui->listWidget->insertItem(0, item); //将item插入到list第0行
MyItem myItem = new MyItem(); //创建一个自定义widget
ui->listWidget->setItemWidget(item, myItem); //将自定义widget设置在item中显示出来
然后看移除:
int i = 0;
QListWidgetItem *item = ui->listWidget->item(i)
ui->listWidget->removeItemWidget(item); //这时这一行仍然存在,显示空白
然后再看删除:
int nRow = 0;
QListWidgetItem *item = ui->listWidget->takeItem(nRow);
delete item;
item = nullptr; //删除一行,记得手动销毁
需要注意的是:
- addItem是在列表末尾插入一行,insertItem是在列表指定位置插入一行。
- setItemWidget是将某一个item设置为自定义的widget显示出来。
- takeItem是删除一行(即一个item),removeItemWidget是将item中的自定义widget移除,并没有删除item。
- setItemWidget和removeItemWidget是一对。
- 删除item时需要手动delete该指针。