6. (П3) Побудова адаптивного інтерфейсу: панель нотаток¶
Передумови¶
- Прочитана Лекція 5 — Менеджери компоновки: QVBoxLayout, QHBoxLayout, QGridLayout
- Успішно запущені приклади
ToolbarDemo,NestedLayoutDemoтаCalculatorDemoз лекції - Модуль
sqlite3зі стандартної бібліотеки (матеріал 2 семестру); нічого додатково встановлювати не треба
Мова в коді
Усі рядкові літерали, написи на віджетах, заголовок вікна, SQL-запити та імена змінних — лише латиницею. Своє ім'я, прізвище та групу пишіть у транслітерації: Ivan Petrenko, KI-31. Кирилиця допускається тільки в коментарях.
Завдання¶
Створити файл workspace.py — панель нотаток, які зберігаються між запусками у базі SQLite.
Головна вимога: Нотатки живуть у базі, а не в пам'яті. Після закриття й повторного запуску застосунку всі нотатки мають бути на місці.
Персоналізація¶
На початку файлу оголосити три константи і використовувати лише їх (не дублювати ці значення в коді):
STUDENT_NAME = "Ivan Petrenko" # ваше ім'я та прізвище транслітерацією
STUDENT_GROUP = "KI-31" # ваша група
DB_FILE = "workspace_ivan_petrenko.db" # файл бази з вашим прізвищем
База даних¶
Одна таблиця, створюється при старті:
CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL,
created_at TEXT NOT NULL
)
created_at заповнюється в Python: datetime.now().strftime("%Y-%m-%d %H:%M").
Схема розміщення елементів¶
Кожен прямокутник на схемі — це один віджет, а підпис усередині — ім'я змінної, під яким його треба створити:
+--------------------------------------------------------------------+
| WorkspacePanel (QWidget) |
+--------------------------------------------------------------------+
| |
| +------------------------+ +------------------+ |
| | title_label | | counter_label | |
| +------------------------+ +------------------+ |
| |
| +------------------+ +----------------------------------------+ |
| | add_button | | note_field | |
| +------------------+ +----------------------------------------+ |
| +------------------+ |
| | delete_button | +----------------------------------------+ |
| +------------------+ | | |
| +------------------+ | | |
| | clear_button | | preview_label | |
| +------------------+ | | |
| | | |
| +----------------------------------------+ |
| |
| +----------------------+ +------------+ |
| | status_label | |quit_button | |
| +----------------------+ +------------+ |
| |
+--------------------------------------------------------------------+
Порожні місця між лівою та правою групами в шапці й підвалі — це addStretch().
Віджети¶
| Ім'я | Тип | Що показує |
|---|---|---|
title_label |
QLabel |
ім'я і групу з констант: Ivan Petrenko, KI-31 |
counter_label |
QLabel |
кількість нотаток у базі: Notes: 4 |
add_button |
QPushButton |
напис Add — додає нотатку з note_field |
delete_button |
QPushButton |
напис Delete last — видаляє останню нотатку |
clear_button |
QPushButton |
напис Clear all — видаляє всі нотатки |
note_field |
QLineEdit |
поле вводу тексту нової нотатки |
preview_label |
QLabel |
нотатки з бази, по одній у рядок:2026-08-19 14:05 read Qt docs2026-08-19 14:07 finish practice 3 |
status_label |
QLabel |
назву файлу бази: Database: workspace_ivan_petrenko.db |
quit_button |
QPushButton |
напис Quit, закриває вікно |
Поведінка¶
Старт. Підключитись до бази, створити таблицю, за потреби додати три власні нотатки, після чого відмалювати вміст бази у вікні.
Оновлення вигляду. Зробити один метод refresh(), який:
- Читає всі нотатки:
SELECT created_at, text FROM notes ORDER BY id. - Формує рядки виду
<created_at> <text>і показує їх уpreview_label, з'єднавши через"\n". Якщо база порожня —No notes yet. - Оновлює
counter_labelнаNotes: <кількість>.
Цей самий метод викликається після кожної зміни бази — окремої копії нотаток у пам'яті класу тримати не треба.
add_button. Якщо note_field порожнє (перевіряти .strip()) — нічого не робити. Інакше INSERT нового рядка з поточним часом, commit(), очистити note_field і викликати refresh().
delete_button. Видаляє нотатку з найбільшим id:
clear_button. DELETE FROM notes — видаляє всі записи.
Закриття. Перевизначити closeEvent() і закрити підключення:
quit_button викликає self.close() — і closeEvent() спрацює сам.
Параметри запитів
Текст нотатки підставляти тільки через плейсхолдер: cursor.execute("INSERT INTO notes (text, created_at) VALUES (?, ?)", (text, created_at)). Склеювання SQL через f-рядок — помилка, за яку знімаються бали.
Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub