# Примеры использования QtMVVM

Коллекция примеров демонстрирует возможности библиотеки QtMVVM.

## Запуск примеров

```bash
# Активация виртуального окружения
source .venv/bin/activate  # Linux/Mac
.venv\Scripts\activate     # Windows

# Запуск примера
python examples/example_01_basic.py
```

## Список примеров

### Пример 1: Базовое использование ObservableProperty
**Файл:** `example_01_basic.py`

Демонстрация основных возможностей:
- Создание наблюдаемого свойства
- Установка и получение значения
- Операторы привязки `>>` (1-way) и `@` (2-way)

### Пример 2: Автоматическая привязка bindAuto
**Файл:** `example_02_bindauto.py`

Автоматическая привязка к различным типам виджетов:
- `QLineEdit` - текстовая привязка
- `QSpinBox`, `QSlider` - числовая привязка
- `QCheckBox` - привязка состояния
- `QComboBox` - привязка текущего текста

### Пример 3: Вычисляемые свойства (ComputedProperty)
**Файл:** `example_03_computed.py`

Использование декоратора `@computed_property`:
- Автоматическое обновление при изменении зависимостей
- Read-only свойства
- Реактивная архитектура на примере калькулятора

### Пример 4: Миксины для специфичной привязки
**Файл:** `example_04_mixins.py`

Специфичные методы привязки:
- `bindText()` - для текстовых виджетов
- `bindValue()` - для числовых виджетов
- `bindChecked()` - для чекбоксов
- `bindCurrentText()` - для комбобоксов

### Пример 5: Форма входа с валидацией
**Файл:** `example_05_login_form.py`

Комплексный пример с:
- Валидацией входных данных
- Блокировкой кнопки при невалидных данных
- Отображением ошибок в реальном времени

### Пример 6: Работа с сигналами
**Файл:** `example_06_signals.py`

Привязка сигналов:
- `bindSignal()` - привязка сигнала к свойству
- Эмуляция таймера
- Синхронизация нескольких виджетов

### Пример 7: Консольная демонстрация
**Файл:** `example_07_console_demo.py`

Демонстрация без GUI:
- Базовое использование `ObservableProperty`
- Операторы привязки
- `BaseViewModel`
- `ComputedProperty`
- Цепочки операций

## Основные концепции

### ObservableProperty

```python
from qtmvvm import ObservableProperty

# Создание свойства
name = ObservableProperty("Alice")

# Чтение/запись
print(name.value)  # "Alice"
name.value = "Bob"

# Подписка на изменения
name.valueChanged.connect(lambda v: print(v))

# Привязка к виджету (1-way)
name >> label

# Привязка к виджету (2-way)
name @ line_edit
```

### BaseViewModel

```python
from qtmvvm import BaseViewModel

class PersonViewModel(BaseViewModel):
    name: str = "John"
    age: int = 30

vm = PersonViewModel()
print(vm.name)  # "John"
vm.name = "Jane"
```

### ComputedProperty

```python
from qtmvvm import BaseViewModel, computed_property

class Rectangle(BaseViewModel):
    width: int = 10
    height: int = 5
    
    @computed_property(depends_on=["width", "height"])
    def area(self):
        return self.width * self.height
```

### bindAuto

```python
# Автоматическая привязка на основе типа виджета
vm.get_property("name").bindAuto(line_edit)      # text
vm.get_property("age").bindAuto(spin_box)        # value
vm.get_property("active").bindAuto(checkbox)     # checked
vm.get_property("city").bindAuto(combobox)       # currentText
```
