Списки
Список — главный элемент приложения для заметок, почтового клиента, плеера. В Qt простой список — это QListWidget.
QListWidget
from PySide6.QtWidgets import QListWidget
lst = QListWidget()
lst.addItem("Купить хлеб") # добавить строку в конец
lst.addItems(["a", "b", "c"]) # несколько строк
lst.insertItem(0, "в начало") # вставить по номеру
lst.count() # сколько строк
lst.item(2).text() # текст строки номер 2
lst.takeItem(2) # вынуть строку (вернёт QListWidgetItem)
lst.clear() # очистить
Номера строк идут с нуля.
Выбор строки
lst.currentRow() # номер выбранной строки или -1
lst.setCurrentRow(3) # выбрать строку
lst.currentItem() # выбранный элемент или None
lst.currentRowChanged.connect(self.on_select) # слот получит номер строки
lst.itemDoubleClicked.connect(self.on_open) # двойной щелчок
Перед удалением или перемещением проверяйте currentRow() >= 0 — пользователь мог ничего не выбрать.
Прятать, а не удалять
Для поиска строки не удаляют, а прячут:
for i in range(lst.count()):
item = lst.item(i)
item.setHidden(query.lower() not in item.text().lower())
setHidden(False) возвращает строку. Важно делать это для каждой строки при каждом запросе — иначе строки, спрятанные прошлым поиском, не вернутся.
Перемещение строк
item = lst.takeItem(row)
lst.insertItem(row - 1, item)
lst.setCurrentRow(row - 1) # выделение — вслед за строкой
Не забудьте про края: у первой строки некуда двигаться вверх, у последней — вниз.
Если строк много
QListWidget хранит строки внутри себя — для небольших списков это удобно. Для больших данных и таблиц в Qt есть архитектура «модель — представление»: QListView / QTableView и модели вроде QStringListModel или своя QAbstractListModel. Тогда данные хранятся отдельно, а виджет только показывает их.
Итог
addItem,insertItem,takeItem,item(i).text(),count();currentRow()(−1 — ничего не выбрано),setCurrentRow, сигналcurrentRowChanged;- фильтр —
setHiddenдля каждой строки; - перемещение —
takeItem+insertItem+setCurrentRow, с проверкой краёв.