Тема 4 из 6

Списки

Список — главный элемент приложения для заметок, почтового клиента, плеера. В 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, с проверкой краёв.