QListWidget 崩溃或不显示因传空指针给 addItem();多选需设 ExtendedSelection 并用 selectedItems() 判空遍历;scrollToItem() 前须确保 item 已添加且 widget 已显示;自定义高度须调 setSizeHint(),复杂样式需 QStyledItemDelegate。

QListWidget 添加 item 时崩溃或不显示?
大概率是忘了 addItem() 或 insertItem() 的参数必须是非空指针,传了空 QString 或直接传字面量没转成 QListWidgetItem*。Qt 5.15+ 对空指针更敏感,一崩就卡在 addItem(nullptr) 这种写法上。
正确做法是:
-
addItem()接收QString(自动构造 item),或显式传new QListWidgetItem("text") - 如果要自定义图标/状态,必须用
new QListWidgetItem构造后调setIcon()、setCheckState(),再传给addItem() - 别手动
deleteitem ——QListWidget自动管理生命周期;删 item 用takeItem()+delete,或直接removeItemWidget()配合itemAt()
QListWidget 多选和获取选中项总为空?
默认是单选模式(SingleSelection),且 selectedItems() 返回的是指针列表,不是索引——很多人误用 currentRow() 或漏掉判空。
实操要点:
- 先设多选:
listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection) - 取选中项用
listWidget->selectedItems(),返回QList<qlistwidgetitem></qlistwidgetitem>,遍历前务必检查非空 - 如果只想要文本,别直接
item->text()后就用——item 可能为nullptr,应写成if (item) item->text() - 注意:勾选框(
Qt::CheckStateRole)需单独启用,setFlags(item->flags() | Qt::ItemIsUserCheckable),否则点不生效
QListWidget 滚动到指定 item 却没反应?
scrollToItem() 看似简单,但依赖 item 已被添加、widget 已 show、且 layout 尚未被冻结(比如在构造函数里调用会失效)。
常见坑:
- item 必须已通过
addItem()或insertItem()加入 widget,不能只 new 了没加 - 确保 widget 已调用
show()或父窗口已 visible,否则滚动区域尺寸为 0 - 滚动策略影响行为:
listWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel)更平滑,但默认的ScrollPerItem有时跳得不准 - 想滚到底部?别用
scrollToItem(lastItem, QAbstractItemView::PositionAtBottom),改用listWidget->scrollToBottom()更稳
QListWidget 自定义 item 高度和样式太难?
直接重写 QListWidgetItem 不起作用——它只是数据容器,不负责绘制。真正控制高度和样式的入口是 delegate 和 item 的 setSizeHint()。
关键步骤:
- 每新增 item 前,必须设尺寸:
item->setSizeHint(QSize(0, 32)),宽度 0 表示自适应,高度决定行高 - 全局统一高度?用
listWidget->setIconSize(QSize(24, 24))影响带图标的 item,但纯文本仍需setSizeHint() - 复杂样式(如多色文字、按钮)必须配
QStyledItemDelegate子类,重写paint()和sizeHint();别试图靠 stylesheet 控制 item 内部布局 - stylesheet 只能影响整体(如
QListWidget::item:hover)或滚动条,对 item 内部元素(如图标、复选框)样式支持有限,Qt 6 中部分失效
addItem() 和 takeItem() 的调用顺序稍错,就会内存泄漏或 crash。

















