1.QListWidget的item存储数据
QListWidget的item,想要存储数据,可以根据item 的不同角色去存储数据,也可以自定义角色(角色是枚举类型的,自定义一般1000开始)。取数据的时候,根据自己自定义的角色数据取数据。一般默认的item会赋予这4个角色:
ItemIsSelectable
ItemIsDragEnabled
ItemIsUserCheckable
ItemIsEnabled
如果想item前面的复选框可以勾选,只需要item设置:
current->setCheckState(Qt::Checked);
这样做,其实是将QListWidget中的indicator展示出来,并不是一个QCheckBox,所以在设置样式的时候,需要设置QListWidget的indicator。
QListWidget::indicator {
width: 13px;
height: 13px;
}
QListWidget::indicator:unchecked {
image: url(:/images/checkbox_unchecked.png);
}
QListWidget::indicator:unchecked:hover {
image: url(:/images/checkbox_unchecked_hover.png);
}
QListWidget::indicator:unchecked:pressed {
image: url(:/images/checkbox_unchecked_pressed.png);
}
QListWidget::indicator:checked {
image: url(:/images/checkbox_checked.png);
}
QListWidget::indicator:checked:hover {
image: url(:/images/checkbox_checked_hover.png);
}
QListWidget::indicator:checked:pressed {
image: url(:/images/checkbox_checked_pressed.png);
}
但是,如果想要取消item前面的复选框,需要设置:
previous->setCheckState(Qt::Unchecked);//这样只是改变了勾选的状态,并不能让其消失不显示
实际上,查看源码可以知道,item使用CheckStateRole这一角色,设置了数据,所以只要移除了这个CheckStateRole角色,就可以达到不显示复选框的效果。
inline void setCheckState(Qt::CheckState state)
{ setData(Qt::CheckStateRole, static_cast<int>(state)); }
但是更好的做法在下面:
previous->setData(Qt::CheckStateRole, QVariant());//设为无效值,这样可以达到想要的效果
以此类推,别的类型的item也可以使用这种方法实现效果。
2.QListWidget禁止鼠标滚轮滚动带动item滚动(禁用滚动条)
ui->listWidget->verticalScrollBar()->setDisabled(true);
但是,这样做之后,发现确实滚动滚轮,item不会联动,但是,当鼠标在QListWidget的两端拖动时,item还是会滚动。其实当鼠标在QListWidget的两端拖动时,变化的是QAbstractScrollArea的视图视野(QListWidget曾继承QAbstractScrollArea),以求将所有item展示出来。此时,还需要对QListWidget进行如下设置:
ui->listWidget->setAutoScroll(false);
这样,才算是正真不随滚轮的滚动而滚动!
3.QListWidget中item滚动到指定的位置
ui->listWidget->scrollToBottom();//滚动到最底部
ui->listWidget->scrollToItem(const QListWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible);//滚动到任意一个item位置
ui->listWidget->scrollToTop();//滚动到最顶部