Тема 6 из 6

Приложение для заметок

Соберём всё вместе — список, редактор, сигналы, сохранение — в настоящее приложение для заметок.

Каркас

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QSplitter

splitter = QSplitter(Qt.Horizontal)
splitter.addWidget(self.list)        # слева — список заметок
splitter.addWidget(self.editor)      # справа — редактор
splitter.setSizes([150, 450])

QSplitter делит окно на части, а пользователь двигает границу мышью.

Данные отдельно от виджетов

Тексты заметок храните в обычном списке Python self.notes, а виджеты пусть только показывают их:

  • выбор строки (currentRowChanged) → показать self.notes[row] в редакторе;
  • правка в редакторе (textChanged) → записать текст в self.notes[row] и обновить подпись строки;
  • сохранение → записать self.notes в JSON (тема 4).

Каждое изменение делайте и в данных, и в виджете — иначе экран и данные разойдутся, и в файл сохранится не то, что видит пользователь.

Заголовок заметки

Подпись в списке — первая непустая строка, обрезанная до разумной длины, с многоточием …. Пустая заметка — «Без названия».

Удаление и создание

  • после удаления выбирайте заметку, вставшую на место удалённой, а если удалили последнюю — новую последнюю: min(row, len(notes) - 1);
  • когда заметок не осталось, редактор очищают и выключают — писать некуда;
  • новая заметка появляется сверху и сразу выбрана; имя без повторов: Новая заметка, Новая заметка 2, …

Что дальше

  • Сборка в программу: pip install pyinstaller и pyinstaller --windowed --onefile notes.py — получится один .exe, который запускается без установленного Python;
  • Qt Designer (pyside6-designer) — рисовать окна мышью и загружать их в программу;
  • QSS — оформление в стиле CSS: app.setStyleSheet("QPushButton { padding: 6px; }");
  • QSettings — запомнить размер окна и последний открытый файл.

Итог

  • QSplitter — список и редактор рядом;
  • данные в self.notes, виджеты только показывают;
  • заголовок из первой непустой строки;
  • удаление с выбором соседа, новые заметки без повторов имён.