# GUI QT6

# QT6 + оглавление

[Платная лицензия](https://www.riverbankcomputing.com/commercial/buy) Похоже надо углубиться в лицензирование opensource.

Страницы компонентов

<table border="1" id="bkmrk-label-push-button-ra" style="border-collapse: collapse; width: 100%; height: 106.172px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr style="height: 35.3906px;"><td class="align-center" style="height: 35.3906px;">[Label](http://bobrobotirk.ru/books/python/page/qt6-qlabel-lcd "QT6 QLabel")</td><td class="align-center" style="height: 35.3906px;">[Push button](http://bobrobotirk.ru/books/python/page/qt6-buttons)</td><td class="align-center" style="height: 35.3906px;">[Radio button](http://bobrobotirk.ru/books/python/page/qt6-buttons)</td></tr><tr style="height: 35.3906px;"><td class="align-center" style="height: 35.3906px;">[Line edit](http://bobrobotirk.ru/books/python/page/qt6-qlineedit)</td><td class="align-center" style="height: 35.3906px;">[Check box](http://bobrobotirk.ru/books/python/page/qt6-checkbox-spinbox-combobox)</td><td class="align-center" style="height: 35.3906px;">[SpinBox](http://bobrobotirk.ru/books/python/page/qt6-checkbox-spinbox-combobox)</td></tr><tr style="height: 35.3906px;"><td class="align-center" style="height: 35.3906px;">[QLCD](http://bobrobotirk.ru/books/python/page/qt6-qlabel-lcd)</td><td class="align-center" style="height: 35.3906px;">[ComboBox](http://bobrobotirk.ru/books/python/page/qt6-checkbox-spinbox-combobox)</td><td class="align-center" style="height: 35.3906px;">[Slider](http://bobrobotirk.ru/books/python/page/qt6-qslider-qlistwidget)</td></tr><tr><td class="align-center">[ListWidget](http://bobrobotirk.ru/books/python/page/qt6-qslider-qlistwidget)</td><td class="align-center">[Table](http://bobrobotirk.ru/books/python/page/qt6-qtable-qmessagebox-dialogs)</td><td class="align-center">Calendar</td></tr><tr><td class="align-center">ColorDialog</td><td class="align-center">FontDialog</td><td class="align-center">[MessageBox](http://bobrobotirk.ru/books/python/page/qt6-qtable-qmessagebox-dialogs)</td></tr><tr><td class="align-center">[Dialogs (save)](http://bobrobotirk.ru/books/python/page/qt6-qtable-qmessagebox-dialogs)</td><td>  
</td><td>  
</td></tr></tbody></table>

Установка:

```bash
pip install pyqt6
pip install pyqt6-tools
```

Минимальное приложение:

```python
from PyQt6.QtWidgets import QApplication, QWidget
import sys

app = QApplication(sys.argv)
window = QWidget()
window.show()
sys.exit(app.exec())
```

Архитектура QT прячется под стандартную, но это не так. QT основывается на цикле событий, внутри реализованы используемые системные процедуры (таймер, ...), и приходится использовать соответствующие QT-модули, а не системные модули. Поэтому в составе QT много модулей.

<table border="1" id="bkmrk-%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-qt" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 16.341%;"></col><col style="width: 83.659%;"></col></colgroup><thead><tr><td class="align-center">**Модуль**</td><td class="align-center">**Назначение**</td></tr></thead><tbody><tr><td>QtWidgets</td><td>Основной и шаблонные виджеты (окно, метка, ...)

</td></tr><tr><td>QtGui</td><td>Классы для интеграции с оконной системой, обработки событий, 2D-графики, базовых изображений, шрифтов, иконок и текста.

QIcon класс работы с иконками

</td></tr><tr><td>QtCore</td><td>Системные модули.

</td></tr></tbody></table>

**Типы окон**

**QMainWindow** Главное окно приложения и связанные с ним классы для управления главным окном.

```python
from PyQt6.QtWidgets import QApplication, QMainWindow
import sys

app = QApplication(sys.argv)
window = QMainWindow()
window.statusBar().showMessage("Welcome to pyqt6 coding")
window.show()
sys.exit(app.exec())
```

QMainWindow имеет свой собственный макет, содержащий QToolBars, QDockWidgets, QMenuBar и QStatusBar.

**QDialog** Базовый класс окна верхнего уровня, используемое для краткосрочных задач и краткого общения с пользователем.   
QDialogs может быть модальным или немодальным.

**QWidget** Базовый класс всех объектов пользовательского интерфейса, получает мышь, клавиатуру и другие события  
из оконной системы и отображает свое изображение на экране.

**Объектно-ориентированный подход настройки окна**

Создаем класс-потомок например от QWidget или QMainWindow, настраиваем свойства и

```python
from PyQt6.QtWidgets import QApplication, QWidget 
from PyQt6.QtGui import QIcon 
import sys 
 
class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.setWindowTitle("Python GUI Development") 
        self.setWindowIcon(QIcon('pyqt6lessons\images\python.png')) 
        self.setStyleSheet('background-color:green') 
        self.setWindowOpacity(0.5) 
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec()) 
```

**Управление событиями**

Основной элемент всех приложений в Qt — класс QApplication. Каждому приложению нужен только один объект QApplication, который содержит цикл событий приложения. Это основной цикл, управляющий всем взаимодействием пользователя с графическим интерфейсом.

[![изображение.png](http://bobrobotirk.ru/uploads/images/gallery/2026-01/scaled-1680-/kJEizobrazenie.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-01/kJEizobrazenie.png)

При каждом взаимодействии с приложением генерируется событие, которое помещается в очередь событий. В цикле событий очередь проверяется на каждой итерации: если найдено ожидающее событие, оно вместе с управлением передаётся определённому обработчику этого события. Последний обрабатывает его, затем возвращает управление в цикл событий и ждёт новых событий. Для каждого приложения выполняется только один цикл событий.

Класс QApplication содержит цикл событий Qt (нужен один экземпляр QApplication). Приложение ждёт в цикле событий новое событие, которое будет сгенерировано при выполнении действия. Всегда выполняется только один цикл событий.

Сигналы — уведомления, отправляемые виджетами, когда что-то происходит. Это может быть нажатие кнопки, изменение текста в поле ввода, изменение текста в окне, ... Многие сигналы инициируются в ответ на действия пользователя, но не только: в сигналах могут отправляться данные с дополнительным контекстом произошедшего.

Слоты — приёмники сигналов. Слотом можно сделать любую функцию (или метод), просто подключив к нему сигнал. Принимающая функция получает данные, отправляемые ей в сигнале. У многих виджетов Qt есть встроенные слоты, эти виджеты можно подключать друг к другу напрямую.

```python
class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.setWindowTitle("Python GUI Development") 
        self.create_button()

    def create_button(self):
        btn = QPushButton("Click", self)
        btn.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        print("Clicked")
```

Соединение сигнала и слота происходит в функции btn.clicked.connect(self.the\_button\_was\_clicked) Таблицы событий:

Мышь:

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-mousebu" style="width: 97.2619%;"><thead><tr><th style="width: 47.9042%;">Тип</th><th style="width: 52.0958%;">Описание</th></tr></thead><tbody><tr><td style="width: 47.9042%;">`MouseButtonPress`</td><td style="width: 52.0958%;">Нажата кнопка мыши</td></tr><tr><td style="width: 47.9042%;">`MouseButtonRelease`</td><td style="width: 52.0958%;">Отпущена кнопка мыши</td></tr><tr><td style="width: 47.9042%;">`MouseButtonDblClick`</td><td style="width: 52.0958%;">Двойной клик</td></tr><tr><td style="width: 47.9042%;">`MouseMove`</td><td style="width: 52.0958%;">Движение мыши</td></tr><tr><td style="width: 47.9042%;">`Wheel`</td><td style="width: 52.0958%;">Колёсико мыши</td></tr><tr><td style="width: 47.9042%;">`Enter`</td><td style="width: 52.0958%;">Курсор вошёл в виджет</td></tr><tr><td style="width: 47.9042%;">`Leave`</td><td style="width: 52.0958%;">Курсор покинул виджет</td></tr><tr><td style="width: 47.9042%;">`HoverEnter`</td><td style="width: 52.0958%;">Hover вошёл</td></tr><tr><td style="width: 47.9042%;">`HoverMove`</td><td style="width: 52.0958%;">Hover движение</td></tr><tr><td style="width: 47.9042%;">`HoverLeave`</td><td style="width: 52.0958%;">Hover вышел</td></tr></tbody></table>

Клавиатура:

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-keypres" style="width: 97.7381%;"><thead><tr><th style="width: 41.4925%;">Тип</th><th style="width: 58.806%;">Описание</th></tr></thead><tbody><tr><td style="width: 41.4925%;">`KeyPress`</td><td style="width: 58.806%;">Нажата клавиша</td></tr><tr><td style="width: 41.4925%;">`KeyRelease`</td><td style="width: 58.806%;">Отпущена клавиша</td></tr><tr><td style="width: 41.4925%;">`Shortcut`</td><td style="width: 58.806%;">Сработал shortcut</td></tr><tr><td style="width: 41.4925%;">`ShortcutOverride`</td><td style="width: 58.806%;">Попытка перехвата shortcut</td></tr><tr><td style="width: 41.4925%;">`InputMethod`</td><td style="width: 58.806%;">IME ввод</td></tr><tr><td style="width: 41.4925%;">`InputMethodQuery`</td><td style="width: 58.806%;">Запрос IME</td></tr></tbody></table>

Фокус и активация

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-focusin" style="width: 97.8571%;"><thead><tr><th style="width: 40.8284%;">Тип</th><th style="width: 59.1716%;">Описание</th></tr></thead><tbody><tr><td style="width: 40.8284%;">`FocusIn`</td><td style="width: 59.1716%;">Получен фокус</td></tr><tr><td style="width: 40.8284%;">`FocusOut`</td><td style="width: 59.1716%;">Потерян фокус</td></tr><tr><td style="width: 40.8284%;">`ActivationChange`</td><td style="width: 59.1716%;">Изменение активности окна</td></tr></tbody></table>

Окна и виджеты

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-show-%D0%92%D0%B8" style="width: 98.2143%;"><thead><tr><th style="width: 45.3258%;">Тип</th><th style="width: 54.6742%;">Описание</th></tr></thead><tbody><tr><td style="width: 45.3258%;">`Show`</td><td style="width: 54.6742%;">Виджет показан</td></tr><tr><td style="width: 45.3258%;">`Hide`</td><td style="width: 54.6742%;">Виджет скрыт</td></tr><tr><td style="width: 45.3258%;">`Close`</td><td style="width: 54.6742%;">Закрытие</td></tr><tr><td style="width: 45.3258%;">`Resize`</td><td style="width: 54.6742%;">Изменение размера</td></tr><tr><td style="width: 45.3258%;">`Move`</td><td style="width: 54.6742%;">Перемещение</td></tr><tr><td style="width: 45.3258%;">`Paint`</td><td style="width: 54.6742%;">Перерисовка</td></tr><tr><td style="width: 45.3258%;">`LayoutRequest`</td><td style="width: 54.6742%;">Запрос layout</td></tr><tr><td style="width: 45.3258%;">`UpdateRequest`</td><td style="width: 54.6742%;">Запрос обновления</td></tr><tr><td style="width: 45.3258%;">`Polish`</td><td style="width: 54.6742%;">Финальная инициализация</td></tr><tr><td style="width: 45.3258%;">`PolishRequest`</td><td style="width: 54.6742%;">Запрос polish</td></tr><tr><td style="width: 45.3258%;">`ParentChange`</td><td style="width: 54.6742%;">Изменился родитель</td></tr><tr><td style="width: 45.3258%;">`ParentAboutToChange`</td><td style="width: 54.6742%;">Родитель изменится</td></tr><tr><td style="width: 45.3258%;">`WindowStateChange`</td><td style="width: 54.6742%;">Изменение состояния окна</td></tr><tr><td style="width: 45.3258%;">`WindowActivate`</td><td style="width: 54.6742%;">Окно активировано</td></tr><tr><td style="width: 45.3258%;">`WindowDeactivate`</td><td style="width: 54.6742%;">Окно деактивировано</td></tr><tr><td style="width: 45.3258%;">`WindowTitleChange`</td><td style="width: 54.6742%;">Заголовок окна</td></tr><tr><td style="width: 45.3258%;">`WindowIconChange`</td><td style="width: 54.6742%;">Иконка окна</td></tr><tr><td style="width: 45.3258%;">`WindowBlocked`</td><td style="width: 54.6742%;">Окно заблокировано</td></tr><tr><td style="width: 45.3258%;">`WindowUnblocked`</td><td style="width: 54.6742%;">Окно разблокировано</td></tr></tbody></table>

Геометрия и экран

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-screenc" style="width: 98.2143%;"><thead><tr><th style="width: 53.3923%;">Тип</th><th style="width: 46.6077%;">Описание</th></tr></thead><tbody><tr><td style="width: 53.3923%;">`ScreenChangeInternal`</td><td style="width: 46.6077%;">Изменился экран</td></tr><tr><td style="width: 53.3923%;">`ScreenChangeInternal`</td><td style="width: 46.6077%;">DPI/Screen изменился</td></tr><tr><td style="width: 53.3923%;">`OrientationChange`</td><td style="width: 46.6077%;">Смена ориентации</td></tr><tr><td style="width: 53.3923%;">`DevicePixelRatioChange`</td><td style="width: 46.6077%;">Изменение DPR</td></tr></tbody></table>

Drag &amp; Drop

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-dragent" style="width: 98.0952%;"><thead><tr><th style="width: 38.6957%;">Тип</th><th style="width: 61.3043%;">Описание</th></tr></thead><tbody><tr><td style="width: 38.6957%;">`DragEnter`</td><td style="width: 61.3043%;">Drag вошёл</td></tr><tr><td style="width: 38.6957%;">`DragMove`</td><td style="width: 61.3043%;">Drag перемещение</td></tr><tr><td style="width: 38.6957%;">`DragLeave`</td><td style="width: 61.3043%;">Drag покинул</td></tr><tr><td style="width: 38.6957%;">`Drop`</td><td style="width: 61.3043%;">Drop</td></tr></tbody></table>

Буфер обмена

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-clipboa" style="width: 97.9762%;"><thead><tr><th style="width: 32.6007%;">Тип</th><th style="width: 67.3993%;">Описание</th></tr></thead><tbody><tr><td style="width: 32.6007%;">`Clipboard`</td><td style="width: 67.3993%;">Изменился буфер обмена</td></tr></tbody></table>

Таймеры

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-timer-%D0%A1" style="width: 97.8571%;"><thead><tr><th style="width: 37.4622%;">Тип</th><th style="width: 62.5378%;">Описание</th></tr></thead><tbody><tr><td style="width: 37.4622%;">`Timer`</td><td style="width: 62.5378%;">Сработал таймер</td></tr><tr><td style="width: 37.4622%;">`ZeroTimerEvent`</td><td style="width: 62.5378%;">Таймер с нулевой задержкой</td></tr></tbody></table>

Touch / Tablet / Gesture

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-touchbe" style="width: 97.8571%;"><thead><tr><th style="width: 49.0637%;">Тип</th><th style="width: 50.9363%;">Описание</th></tr></thead><tbody><tr><td style="width: 49.0637%;">`TouchBegin`</td><td style="width: 50.9363%;">Touch начало</td></tr><tr><td style="width: 49.0637%;">`TouchUpdate`</td><td style="width: 50.9363%;">Touch обновление</td></tr><tr><td style="width: 49.0637%;">`TouchEnd`</td><td style="width: 50.9363%;">Touch конец</td></tr><tr><td style="width: 49.0637%;">`TabletPress`</td><td style="width: 50.9363%;">Перо нажато</td></tr><tr><td style="width: 49.0637%;">`TabletMove`</td><td style="width: 50.9363%;">Перо движение</td></tr><tr><td style="width: 49.0637%;">`TabletRelease`</td><td style="width: 50.9363%;">Перо отпущено</td></tr><tr><td style="width: 49.0637%;">`Gesture`</td><td style="width: 50.9363%;">Жест</td></tr><tr><td style="width: 49.0637%;">`GestureOverride`</td><td style="width: 50.9363%;">Перехват жеста</td></tr></tbody></table>

Состояние

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-enabled" style="width: 98.0952%;"><thead><tr><th style="width: 51.567%;">Тип</th><th style="width: 48.433%;">Описание</th></tr></thead><tbody><tr><td style="width: 51.567%;">`EnabledChange`</td><td style="width: 48.433%;">Изменение enabled</td></tr><tr><td style="width: 51.567%;">`FontChange`</td><td style="width: 48.433%;">Изменение шрифта</td></tr><tr><td style="width: 51.567%;">`StyleChange`</td><td style="width: 48.433%;">Изменение стиля</td></tr><tr><td style="width: 51.567%;">`PaletteChange`</td><td style="width: 48.433%;">Изменение палитры</td></tr><tr><td style="width: 51.567%;">`LanguageChange`</td><td style="width: 48.433%;">Смена языка</td></tr><tr><td style="width: 51.567%;">`LocaleChange`</td><td style="width: 48.433%;">Смена локали</td></tr><tr><td style="width: 51.567%;">`ThemeChange`</td><td style="width: 48.433%;">Смена темы</td></tr><tr><td style="width: 51.567%;">`ApplicationStateChange`</td><td style="width: 48.433%;">Состояние приложения</td></tr></tbody></table>

Продвинутые опции

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-dynamic" style="width: 97.7381%;"><thead><tr><th style="width: 41.8269%;">Тип</th><th style="width: 58.1731%;">Описание</th></tr></thead><tbody><tr><td style="width: 41.8269%;">`DynamicPropertyChange`</td><td style="width: 58.1731%;">Изменение свойства</td></tr><tr><td style="width: 41.8269%;">`ChildAdded`</td><td style="width: 58.1731%;">Добавлен ребёнок</td></tr><tr><td style="width: 41.8269%;">`ChildRemoved`</td><td style="width: 58.1731%;">Удалён ребёнок</td></tr><tr><td style="width: 41.8269%;">`ChildPolished`</td><td style="width: 58.1731%;">Ребёнок отполирован</td></tr><tr><td style="width: 41.8269%;">`MetaCall`</td><td style="width: 58.1731%;">Вызов meta-object</td></tr><tr><td style="width: 41.8269%;">`ThreadChange`</td><td style="width: 58.1731%;">Смена потока</td></tr><tr><td style="width: 41.8269%;">`DeferredDelete`</td><td style="width: 58.1731%;">Отложенное удаление</td></tr><tr><td style="width: 41.8269%;">`Quit`</td><td style="width: 58.1731%;">Завершение приложения</td></tr><tr><td style="width: 41.8269%;">`PlatformSurface`</td><td style="width: 58.1731%;">Изменение поверхности</td></tr><tr><td style="width: 41.8269%;">`PlatformPanel`</td><td style="width: 58.1731%;">Platform panel</td></tr><tr><td style="width: 41.8269%;">`User`</td><td style="width: 58.1731%;">Начало пользовательских событий</td></tr></tbody></table>

Пользовательские события

<table id="bkmrk-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-user-%D0%91%D0%B0" style="width: 97.1429%;"><thead><tr><th style="width: 24.5914%;">Тип</th><th style="width: 75.4137%;">Описание</th></tr></thead><tbody><tr><td style="width: 24.5914%;">`User`</td><td style="width: 75.4137%;">Базовый пользовательский event</td></tr><tr><td style="width: 24.5914%;">`MaxUser`</td><td style="width: 75.4137%;">Максимальный ID</td></tr></tbody></table>

```python
event = QEvent(QEvent.Type.User)
QCoreApplication.postEvent(obj, event)
```

Поиск событий:

```python
def event(self, event):
    print(event.type())
    return super().event(event)

#или
widget.installEventFilter(self)

def eventFilter(self, obj, event):
    print(obj, event.type())
    return False

```

# QT6Core

QTime класс управления / работы со временем.

```python
time = QTime.currentTime()
text = time.toString('hh:mm')
```

QTimer класс тайминга. Настраивается при инициализации класса.

```python
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200, 700, 400)
        self.setWindowTitle("Python GUI Development")

        self.timer = QTimer()
        self.timer.timeout.connect(self.update_lcd)
        self.timer.start(1000)

        self.create_button()
```

# QT6 настройка окна

**Компоновщики (Layouts).**

Нужны для автоматического упорядочивания и изменения размеров виджетов при изменении размера окна. Без Layouts виджеты имеют фиксированные позиции и размеры. Импортируются все типы компоновщиков через

```python
from PyQt6.QtWidgets import QHBoxLayout
```

Типы Layouts в Qt Designer

<table border="1" id="bkmrk-vertical-layout-%28%D0%92%D0%B5%D1%80" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 28.2739%;"></col><col style="width: 71.8453%;"></col></colgroup><tbody><tr><td>Vertical Layout (Вертикальный компоновщик)</td><td>Располагает виджеты сверху вниз в столбик. ```python
layout = QVBoxLayout()
layout.addWidget(button1)
layout.addWidget(button2)
```

</td></tr><tr><td>Horizontal Layout (Горизонтальный компоновщик)</td><td>Располагает виджеты слева направо в строку. ```python
QHBoxLayout()
```

</td></tr><tr><td>Grid Layout (Сеточный компоновщик)</td><td>Располагает виджеты в таблице (строках и столбцах). ```python
layout = QGridLayout()
layout.addWidget(button1, 0, 0)  # строка 0, столбец 0
layout.addWidget(button2, 0, 1)  # строка 0, столбец 1
```

</td></tr><tr><td>Form Layout (Формовый компоновщик)</td><td>Идеален для форм (метка + поле ввода).  
Располагает виджеты в две колонки: labels слева, поля справа. ```
QFormLayout()
```

</td></tr></tbody></table>

```python
class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.mainlayout = QVBoxLayout()

        bt1 = QPushButton("one")
        bt2 = QPushButton("two")
        bt3 = QPushButton("three")
        bt4 = QPushButton("four")

        self.mainlayout.addWidget(bt1)
        self.mainlayout.addWidget(bt2)
        self.mainlayout.addWidget(bt3)
        self.mainlayout.addWidget(bt4)

        self.setLayout(self.mainlayout)
```

**Базовый подход:**

- Перетащите виджеты на форму
- Выделите несколько виджетов (зажав Ctrl)
- Нажмите правой кнопкой → "Lay out" → Выберите нужный тип
- Или используйте панель инструментов сверху (кнопки с иконками Layouts)

**Вложенные Layouts:**

```
Main Vertical Layout
├── Horizontal Layout (для кнопок)
│   ├── Кнопка "Открыть"
│   ├── Кнопка "Сохранить"
│   └── Кнопка "Выход"
└── Text Edit (занимает оставшееся пространство)
```

Еще класс, просто для примера. Соотношение 1:2

```python
class Window(QWidget): 
    '''
    Вложенные Layout
    '''
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.setWindowTitle("Python GUI Development") 
        self.mainlayout = QVBoxLayout()

        lbl1 = QLabel("one label")
        lbl2 = QLabel("two label")

        bt1 = QPushButton("one")
        bt2 = QPushButton("two")

        self.innerlayout1 = QHBoxLayout()
        self.innerlayout1.addWidget(lbl1, stretch=1)
        self.innerlayout1.addWidget(bt1,stretch=2)
        self.mainlayout.addLayout(self.innerlayout1)

        self.innerlayout2 = QHBoxLayout()
        self.innerlayout2.addWidget(lbl2, stretch=1)
        self.innerlayout2.addWidget(bt2,stretch=2)
        self.mainlayout.addLayout(self.innerlayout2)

        self.setLayout(self.mainlayout)
```

**Растяжения (Stretch):**

```
В коде: layout.addStretch()
В Designer: есть специальный виджет "Horizontal Spacer" / "Vertical Spacer"
```

**Выравнивание:** В Property Editor настраивается

- layoutStretch — пропорции растяжения
- alignment — выравнивание содержимого
- spacing — расстояние между виджетами, пустое место

```
self.mainlayout.addSpacing(100)
```

- margin — отступ от краев

Пожелания при использовании Layouts

- Всегда используйте центральный Layout для главного окна
- Не смешивайте абсолютное позиционирование и Layouts
- Тестируйте ресайз окна
- Используйте Spacers для гибких промежутков
- Настройте stretch factors для управления пропорциями

**Stretch Factors**

Stretch factor — числовое значение, определяющее пропорцию, в которой виджеты делят доступное пространство при растяжении окна.

**Базовые принципы:**

- По умолчанию stretch factor = 0
- Виджет сохраняет свой минимальный размер
- Не растягивается при увеличении окна
- Чем больше значение, тем больше пространства получает виджет
- Важны относительные пропорции

**Настройка при создании**

Способ 1: Панель свойств (Property Editor)

- Выберите Layout в иерархии объектов
- Найдите свойство layoutStretch или layoutRowStretch / layoutColumnStretch
- Введите значения через запятую

[![изображение.png](http://bobrobotirk.ru/uploads/images/gallery/2026-01/scaled-1680-/3vzizobrazenie.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-01/3vzizobrazenie.png)

В данном примере первая кнопка не будет менять размеры, вторая будет занимать 20% от оставшегося свободного места, третья 80%.

Способ 2:Через свойства виджетов внутри Layout

У каждого виджета есть свойство sizePolicy → horizontalStretch / verticalStretch

Способ 3: Через код

```python
# при добавлении нового виджета
self.mainlayout.addWidget(bt1, stretch=1)
self.mainlayout.addWidget(bt2, stretch=3)
self.mainlayout.addWidget(bt3, stretch=0)
self.mainlayout.addWidget(bt4, stretch=5)
```

**Настройка после создания**

Способ 1: Использовать setStretch(index, stretch)

```python
# Предположим, у вас уже есть Layout с виджетами
self.mainlayout.addWidget(bt1, stretch=1)
self.mainlayout.addWidget(bt2, stretch=3) 
self.mainlayout.addWidget(bt3, stretch=0)
self.mainlayout.addWidget(bt4, stretch=5)

# Позже меняем stretch для bt4 (индекс 3, так как индексы начинаются с 0)
self.mainlayout.setStretch(3, 2)  # Меняем с 5 на 2
```

Способ 2: Получить индекс виджета динамически

```python
# Находим индекс виджета bt4 в Layout
index = self.mainlayout.indexOf(bt4)
if index != -1:  # -1 означает "не найден"
    self.mainlayout.setStretch(index, 2)
```

Способ 3: Пересоздать Layout (более кардинальный)

```python
# Удаляем все виджеты из Layout
while self.mainlayout.count():
    item = self.mainlayout.takeAt(0)
    if item.widget():
        item.widget().hide()

# Добавляем заново с новыми stretch factors
self.mainlayout.addWidget(bt1, stretch=1)
self.mainlayout.addWidget(bt2, stretch=3)
self.mainlayout.addWidget(bt3, stretch=0)
self.mainlayout.addWidget(bt4, stretch=2)  # Новое значение!
```

Способ 4: Изменить через setSizePolicy виджета.

```python
# Получаем текущую политику размеров
policy = bt4.sizePolicy()

# Устанавливаем горизонтальный/вертикальный stretch
policy.setHorizontalStretch(2)  # Для Horizontal Layout
policy.setVerticalStretch(2)    # Для Vertical Layout

bt4.setSizePolicy(policy)
bt4.update()  # Обновляем виджет
```

Важно: Этот метод влияет на поведение виджета во всех Layout, где он находится!

Способ 5: Временное отключение обновления для избежания мерцания при изменении:

```python
# Блокируем обновление
self.setUpdatesEnabled(False)

# Меняем stretch
index = self.mainlayout.indexOf(bt4)
self.mainlayout.setStretch(index, 2)

# Включаем обновление и форсируем перерасчет
self.setUpdatesEnabled(True)
self.mainlayout.invalidate()  # Помечаем Layout как невалидный
self.mainlayout.activate()    # Принудительно пересчитываем
```

Особенности работы:

- Изменения применяются немедленно — Layout пересчитается при следующем обновлении интерфейса
- Индексы начинаются с 0 и соответствуют порядку добавления
- Spacer'ы тоже имеют индексы — учитывайте это при поиске
- setStretch() работает только для QBoxLayout (QVBoxLayout, QHBoxLayout)
- Для QGridLayout используйте setRowStretch() и setColumnStretch()
- Для QFormLayout сложнее — лучше удалить и добавить заново

**Проверка текущих значений:**

```python
# Получить текущий stretch factor
current_stretch = self.mainlayout.stretch(3)  # Для индекса 3
print(f"Текущий stretch: {current_stretch}")

# Получить список всех stretch factors
for i in range(self.mainlayout.count()):
    widget = self.mainlayout.itemAt(i).widget()
    stretch = self.mainlayout.stretch(i)
    if widget:
        print(f"Индекс {i}: {widget.text()} - stretch={stretch}")
```

**Класс окна**

Для управления классом окна, класс создается, затем настраиваются нужные свойства

```python
from PyQt6.QtWidgets import QApplication, QWidget 
from PyQt6.QtGui import QIcon 
import sys 
 
class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec())
```

Свойства:

   
 self.setWindowIcon(QIcon('pyqt6lessons\\images\\python.png'))   
 self.setStyleSheet('background-color:green')   
 self.setWindowOpacity(0.5)

<table border="1" id="bkmrk-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 30.8929%;"></col><col style="width: 69.2263%;"></col></colgroup><thead><tr><td class="align-center">**Свойство**</td><td class="align-center">**Применение**</td></tr></thead><tbody><tr><td>Размеры окна</td><td>self.setGeometry(x,y, height, width)

self.setGeometry(200,200, 700, 400)

</td></tr><tr><td>Заголовок окна</td><td>self.setWindowTitle("Python GUI Development")</td></tr><tr><td>  
</td><td>  
</td></tr><tr><td>  
</td><td>  
</td></tr><tr><td>  
</td><td>  
</td></tr></tbody></table>

# QT6 desiner

Устанавливается при установке pyqt6-tools

У меня вызвался обычной командой

```bash
(myenv) D:\projects\calclulator_long>pyside6-designer.exe
```

**Типы создаваемых окон:**

- 3 типа диалоговых окон,
- Основное окно
- 10 виджетов.

Различаются родительским классом и наличием дополнительных виджетов (кнопки, ...)

**Предпросмотр результата**

Блок меню Form - Preview... очень занимательный.

[![изображение.png](http://bobrobotirk.ru/uploads/images/gallery/2026-01/scaled-1680-/34Yizobrazenie.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-01/34Yizobrazenie.png)

QT использует стили операционных систем, поэтому вид будет отличаться на разных ОС.

**Слои (Layouts)**

Настраивается отдельно тип для всей формы и для группы элементов.

Настройка для группы элементов: выделяются виджеты, ПКМ - Lay Out - Нужный тип.

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/image.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/image.png)

Для всей формы: ПКМ на пустом месте формы - Lay Out - Нужный тип.

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/gVYimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/gVYimage.png)

**Использование .ui файла**

**Использование в скрипте**

Два варианта: преобразование в py файл и загрузка в py скрипт ui-файла во время выполнения.

Преобразование в python файл:

```bash
(myenv) D:\projects\calclulator_long>pyuic6 -x testui.ui -o testuicreated.py
```

После этого запуск \*,py файла откроет пользовательский интерфейс. При изменении \*.ui файла необходимо обновить файл исходного кода и связанных процедур.

Загрузка ui файла во время выполнения

```python
from PyQt6.QtWidgets import QApplication, QWidget 
import sys 
from PyQt6 import uic 
 
class UI(QWidget): 
    def __init__(self): 
        super().__init__() 
        uic.loadUi("WindowUI.ui", self) 
 
app = QApplication(sys.argv) 
window = UI() 
window.show() 
app.exec()
```

**Доступ к виджетам внутри .ui файла**

Для дальнейшего доступа к виджетам из py скрипта необходимо знать тип виджета и имя объекта. Например, есть виджет типа QLineEdit, имя объекта lineEdit\_price.

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/t3Rimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/t3Rimage.png)

Создадим свойство объекта через FindChild

```python
class UI(QWidget): 
    def __init__(self): 
        super().__init__() 
        uic.loadUi("double_spin.ui", self)

        self.linePrice = self.findChild(QLineEdit, "lineEdit_price")
```

Дальше с этим свойством работать также как с созданным объектом. Пример:

```python
lass UI(QWidget): 
    def __init__(self): 
        super().__init__() 
        uic.loadUi("double_spin.ui", self)

        self.linePrice = self.findChild(QLineEdit, "lineEdit_price")
        self.doublespin = self.findChild(QDoubleSpinBox, "doubleSpinBox")
        self.doublespin.valueChanged.connect(self.spin_selected)
        self.lineresult = self.findChild(QLineEdit, "lineEdit_total")

    def spin_selected(self):
        if self.linePrice.text() != 0:
            price = int(self.linePrice.text())
            totalPrice = self.doublespin.value() * price
            self.lineresult.setText(str(totalPrice))
```

**Соединение действий виджетов**

Функционал урезан. Нажать кнопку Edit signals/slots

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/7hAimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/7hAimage.png)

При наведении мыши виджет становится красным. Если нажать виджет, с которого сигнал будет исходить и, удерживая мышь, переместить указатель на виджет, на который будет влиять сигнал, появится стрелка и элемент выбора сигналов/слотов.

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/WFrimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/WFrimage.png)

Нужно установить флажок внизу. Выбирается сигнал, слот и все работает даже на превью.

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/mFhimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/mFhimage.png)

# QT6 QLabel, LCD

**QLabel**

Класс QLabel используется для отображения сообщений и изображений,

- Импорт QLabel
- Создание объекта класса QLabel
- Применение методов класса к переменной

```python
from PyQt6.QtWidgets import QApplication, QWidget, QLabel
import sys 
 
class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.setWindowTitle("Python GUI Development") 
        label = QLabel("", self)
        label.setText('first text in label')
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec())
```

Для создания метки с изображением текст не передается

```python
label = QLabel(self)
```

Таблица методов:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-set" style="border-collapse: collapse; width: 100%; height: 331.6px;"><colgroup><col style="width: 25.3874%;"></col><col style="width: 74.6126%;"></col></colgroup><thead><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">**Метод**</td><td class="align-center" style="height: 29.8px;">**Назначение**</td></tr></thead><tbody><tr style="height: 29.8px;"><td style="height: 29.8px;">setText()</td><td style="height: 29.8px;">Устанавливается новый текст метки</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">setNum()</td><td style="height: 29.8px;">добавляет целое или двойное значение</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">clear()</td><td style="height: 29.8px;">удаляет текст</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">setMovie()</td><td style="height: 29.8px;">установки изображения gif

movie = QMovie('images/sky.gif')   
movie.setSpeed(500)   
label.setMovie(movie)   
movie.start()

</td></tr><tr style="height: 46.6px;"><td style="height: 46.6px;">setFont()</td><td style="height: 46.6px;">Изменения шрифта, setFont() ожидает класс QFont, (потомок QtGui)   
label.setFont(QFont("Sanserif", 15))</td></tr><tr style="height: 46.6px;"><td style="height: 46.6px;">label.setStyleSheet()</td><td style="height: 46.6px;">Изменение цвета шрифта

label.setStyleSheet('color:red')

</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">Добавление изображения</td><td style="height: 29.8px;"></td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">setPixamp()</td><td style="height: 29.8px;">pixmap = QPixmap('images/python.png')   
label.setPixmap(pixmap) </td></tr><tr><td>QImage, QBitmap QPicture</td><td>  
</td></tr></tbody></table>

**QLCDNumber**

Класс для отображения 7-сегментного дисплея, отображает 5 (пять) 8- 10- 16- ричных элементов.

```python
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200, 700, 400)
        self.setWindowTitle("Python GUI Development")

        self.timer = QTimer()
        self.timer.timeout.connect(self.update_lcd)
        self.timer.start(1000)

        self.create_button()

    def create_button(self):
        vbox = QVBoxLayout()

        self.lcd = QLCDNumber()
        self.lcd.setStyleSheet('background:red')

        vbox.addWidget(self.lcd)

        time = QTime.currentTime()
        text = time.toString('hh:mm')

        self.lcd.display(text)
        self.setLayout(vbox)

    def update_lcd(self):
        time = QTime.currentTime()
        text = time.toString('hh:mm')
        self.lcd.display(text)
```

# QT6 Buttons

**QPushButtons**

Командная кнопка является наиболее часто используемым виджетом в любом графическом интерфейсе пользователя. Нажатие (click) кнопки является командой компьютеру выполнить какое-либо действие. Типичными кнопками являются "ОК", "Применить", "Отмена", "Закрыть"., Да, Нет и Справка.   
Командная кнопка имеет прямоугольную форму и обычно отображает текстовую метку, описывающую ее действие. Можно указать комбинацию клавиш, указав перед нужным символом амперсанд в тексте.   
чтобы отобразить кнопку в приложении, вам необходимо создать экземпляр класса QPushButton.

```python
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton
import sys 
 
class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.setWindowTitle("Python GUI Development") 
        self.create_button()

    def create_button(self):
        btn = QPushButton("Click", self)
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec())
```

Методы класса:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-sette" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 16.2501%;"></col><col style="width: 83.8691%;"></col></colgroup><thead><tr><td class="align-center">**Метод**</td><td class="align-center">**Описание**</td></tr></thead><tbody><tr><td>setText()</td><td>Изменение текста</td></tr><tr><td>setIcon()</td><td>Добавление иконки на кнопку

btn.setIcon(QIcon("images/python.png"))

</td></tr><tr><td>  
</td><td>Изменение размера иконки

```python
from PyQt6.QtCore import QSize
from PyQt6.QtGui import QIcon 

    def create_button(self):
        btn = QPushButton("Click", self)
        btn.setGeometry(100, 100, 130, 50)
        btn.setIcon(QIcon('pyqt6lessons\images\python.png'))
        btn.setIconSize(QSize(36,36))
```

</td></tr><tr><td>setGeometry()</td><td>Настройка положения кнопки, </td></tr><tr><td>setMenu()</td><td>Всплывающее меню над кнопкой. Сначала создать объект QMenu, класс QMenu связан с модулем QtWidgets, класс QMenu предоставляет виджет меню для использования в строках меню, контекстных меню и других всплывающих меню.   
Виджет меню - это меню выбора. Это может быть как выпадающее меню в строке меню, так и отдельное контекстное меню. Выпадающие меню отображаются в строке меню, когда пользователь щелкает на соответствующем элементе или нажимает указанную комбинацию клавиш.

```python
menu = QMenu() 
menu.setFont(QFont("Times", 14, 
QFont.Weight.ExtraBold)) 
menu.setStyleSheet('background-color:green') 
menu.addAction("Copy") 
menu.addAction("Cut") 
menu.addAction("Paste") 
btn.setMenu(menu) 
```

 [![изображение.png](http://bobrobotirk.ru/uploads/images/gallery/2026-01/scaled-1680-/UnYizobrazenie.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-01/UnYizobrazenie.png)

</td></tr><tr><td>setFont()</td><td>Настройка шрифта

btn.setFont(QFont("Times", 14, QFont.Weight.ExtraBold))

</td></tr><tr><td>setCheckable()</td><td>Вид кнопки при нажатии меняется. Выделяется и снимается выделение.

</td></tr></tbody></table>

**QRadioButtons**

Кнопка, которую можно включить (установить флажок) или выключить (снять флажок). Переключатели обычно предоставляют  
пользователю возможность выбора "из многих". В группе переключателей одновременно может быть установлен только один переключатель, если пользователь выбирает другую кнопку, ранее выбранная кнопка отключается. Существуют различные методы, которые вы можете использовать, например, у нас есть IsChecked(), и он возвращает логическое значение true, если кнопка находится в выбранном состоянии, или у нас есть метод setIcon(), с помощью которого мы можем добавить значок для радиокнопки, а также setText(), который задает текст выбранной кнопки. Также существуют различные сигналы, которые вы можете использовать, например, у нас есть переключаемый сигнал, который используется всякий раз, когда переключатель меняет свое состояние с установленного на снятое и наоборот.

RadioButtons объединенные в одном hbox рассматриваются как зависимые.

```python
from PyQt6.QtWidgets import QApplication, QWidget, QHBoxLayout, QRadioButton, QLabel
from PyQt6.QtWidgets import QVBoxLayout
import sys 
 
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200, 700, 400)
        self.setWindowTitle("Python GUI Development")
        self.create_button()

    def create_button(self):
        hbox = QHBoxLayout()

        self.label = QLabel("", self)
        vbox = QVBoxLayout()
        vbox.addWidget(self.label)
        vbox.addLayout(hbox)

        rad1 = QRadioButton("Python")
        rad1.toggled.connect(self.radio_selected)
        hbox.addWidget(rad1)
        rad2 = QRadioButton("Java")
        rad2.toggled.connect(self.radio_selected)
        hbox.addWidget(rad2)
        rad3 = QRadioButton("JavaScript")
        rad3.toggled.connect(self.radio_selected)
        hbox.addWidget(rad3)

        self.setLayout(vbox)

    def radio_selected(self):
        radio_btn = self.sender()
        if radio_btn.isChecked():
            self.label.setText(f'Selected: {radio_btn.text()}')

app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
```

Методы класса:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-ische" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 16.2501%;"></col><col style="width: 83.8691%;"></col></colgroup><thead><tr><td class="align-center">**Метод**</td><td class="align-center">**Описание**</td></tr></thead><tbody><tr><td>isChecked()</td><td>Возвращает True если кнопка выбрана</td></tr><tr><td>setChecked()</td><td>Переводит кнопку в выбранное состояние</td></tr><tr><td>setIcon()</td><td>Устанавливает иконку кнопки</td></tr><tr><td>setText()</td><td>Текст</td></tr></tbody></table>

# QT6 QLineEdit

Виджет позволяет вводить и редактировать одну строку обычного текста с помощью полезного набора функций редактирования, включая отмену и повтор, вырезание и вставку, а также перетаскивание.

  
Методы:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-set" style="border-collapse: collapse; width: 100%; height: 238.4px;"><colgroup><col style="width: 31.4882%;"></col><col style="width: 68.631%;"></col></colgroup><thead><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">**Метод**</td><td class="align-center" style="height: 29.8px;">**Назначение**</td></tr></thead><tbody><tr style="height: 29.8px;"><td style="height: 29.8px;">setEchoMode()</td><td style="height: 29.8px;">Режим эхо. Варианты:

- Normal: все введенные символы отображаются
- NoEcho: ни один введенный символ не отображается
- Password: вместо символов выводится звездочка
- PasswordEchoOnEdit: При редактировании полей пароля отображается фактический текст, в противном случае текст будет помечен звездочками

</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">setFont()</td><td style="height: 29.8px;">Настройка шрифта</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">maxLength()</td><td style="height: 29.8px;">Максимальная длина текста</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">setText()</td><td style="height: 29.8px;">Устанавливает текст</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">text()</td><td style="height: 29.8px;">Получает текст</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">clear()</td><td style="height: 29.8px;">Очищает строку ввода</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">setReadOnly()</td><td style="height: 29.8px;">Установка режима только для чтения</td></tr><tr><td>setEnabled()</td><td>Доступность компонента пользователю</td></tr><tr><td>setFocus()</td><td>Установить фокус</td></tr><tr><td>setPlaceholderText()</td><td>Текст когда поле пустое</td></tr></tbody></table>

# QT6 CheckBox, SpinBox, ComboBox

**QCheckbox**

Это кнопка выбора, которую можно включить (установить флажок) или выключить (снять флажок). Флажки обычно используются для обозначения функций в приложении, которые можно включать или отключать, не затрагивая другие. При изменении состояния флажка выдается сигнал StateChanged(). Метод IsChecked() используется для запроса, установлен ли флажок.

Методы:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-ische" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 13.0358%;"></col><col style="width: 87.0834%;"></col></colgroup><thead><tr><td>Метод</td><td>Описание</td></tr></thead><tbody><tr><td>isChecked()</td><td>  
</td></tr><tr><td>setIcon()</td><td>  
</td></tr><tr><td>setText()</td><td>  
</td></tr><tr><td>setChecked()</td><td>  
</td></tr></tbody></table>

Сигналы:

stateChanged

**QSpinbox**

QSpinBox предназначен для обработки целых чисел и дискретных наборов значений, позволяет выбирать значение, нажимая кнопки вверх / вниз или нажимая клавиши вверх / вниз на клавиатуре, чтобы увеличить / уменьшить отображаемое в данный момент значение. Также возможно ввести значение вручную.

Методы:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-value" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 13.0358%;"></col><col style="width: 87.0834%;"></col></colgroup><thead><tr><td>Метод</td><td>Описание</td></tr></thead><tbody><tr><td>value()</td><td>текущее выбранное целое значение</td></tr><tr><td>text()</td><td>отображения текста в окне прокрутки</td></tr><tr><td>setMinimum()

</td><td>  
</td></tr><tr><td>setMaximum()</td><td>  
</td></tr><tr><td>setPrefix()</td><td>текстовый префикс, добавляемый перед значением, возвращаемым полем прокрутки. </td></tr><tr><td>setSuffix()</td><td>текст суффикса, добавляемый к значению, возвращаемому блоком spin.</td></tr></tbody></table>

Сигналы:

valueChanged()

editingFinished() выдается при потере фокуса на spinbox. Предполагаю, актуально для приложений с web backend при передаче финальных данных.

```python
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout, QLineEdit
from PyQt6.QtWidgets import QSpinBox
import sys 
 
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200, 700, 400)
        self.setWindowTitle("Python GUI Development")
        self.create_button()

    def create_button(self):
        hbox = QHBoxLayout()
        label = QLabel("Laptop price: ")
        self.lineedit = QLineEdit()
        self.spinbox = QSpinBox()
        self.spinbox.valueChanged.connect(self.spin_selected)

        self.total_result = QLineEdit()

        hbox.addWidget(label)
        hbox.addWidget(self.lineedit)
        hbox.addWidget(self.spinbox)
        hbox.addWidget(self.total_result)
        self.setLayout(hbox)

    def spin_selected(self):
        if self.lineedit.text() != 0:
            price = int(self.lineedit.text())
            totalPrice = self.spinbox.value() * price
            self.total_result.setText(str(totalPrice))
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec())
```

**QComboBox**

Виджет выбора, отображающий текущий элемент. Также отображает список выбираемых элементов. Может быть редактируемым.

Также есть специализированный ComboBox: для выбора шрифтов (fontComboBox).

Методы:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-setit" style="border-collapse: collapse; width: 100%; height: 331.563px;"><colgroup><col style="width: 15.1345%;"></col><col style="width: 84.8655%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td style="height: 29.7969px;">Метод</td><td style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">setItemText()</td><td style="height: 29.7969px;">Устанавливает или изменяет текст элемента в поле со списком. </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">removeItem()</td><td style="height: 29.7969px;">Удаляет определенный элемент из поля со списком. </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">clear()</td><td style="height: 29.7969px;">Удаляет все элементы из поля со списком.</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">currentText()</td><td style="height: 29.7969px;">Возвращает текст текущего элемента, то есть элемента, который выбран в данный момент. </td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">setCurrentIndex()</td><td style="height: 46.5938px;">Устанавливает текущий индекс поля со списком, то есть задает желаемый элемент в поле со списком в качестве выбранного в данный момент элемента. </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">count()</td><td style="height: 29.7969px;">Возвращает количество элементов в поле со списком. </td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">setEditable()</td><td style="height: 46.5938px;">Сделайте поле со списком доступным для редактирования, то есть пользователь можно редактировать элементы в поле со списком. </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">addItem()</td><td style="height: 29.7969px;">Добавляет указанное содержимое в поле со списком. </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">itemText()</td><td style="height: 29.7969px;">Возвращает текст в указанное расположение индекса в поле со списком.</td></tr><tr><td>currentIndex()</td><td>Возвращает индексное местоположение текущего выбранного элемента в поле со списком. Если поле со списком пусто или в поле со списком в данный момент не выбран ни один элемент, метод вернет значение -1 в качестве индекса.</td></tr></tbody></table>

Сигналы

currentIndexChanged() выбор нового элемента

editTextChanged() изменение текста в редактируемом комбобоксе

```python
from PyQt6.QtWidgets import QApplication, QWidget, QComboBox, QLabel, QHBoxLayout, QVBoxLayout
import sys 
 
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200, 700, 400)
        self.setWindowTitle("Python GUI Development")
        self.create_button()

    def create_button(self):
        hbox = QHBoxLayout()
        label = QLabel('Select type: ')
        self.combo = QComboBox()
        self.combo.addItem('')
        self.combo.addItem('Current account')
        self.combo.addItem('Deposite account')
        self.combo.addItem('Saving account')
        self.combo.currentTextChanged.connect(self.updresult)
        hbox.addWidget(label)
        hbox.addWidget(self.combo)
        
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)

        self.label_result = QLabel('')
        vbox.addWidget(self.label_result)
        
        self.setLayout(vbox)

    def updresult(self):
        self.label_result.setText('Your type: ' + self.combo.currentText())
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec())
```

# QT6 QSlider, QListWidget

**QSlider**

Ползунок - виджет управления ограниченным значением. Позволяет перемещать ручку ползунка и преобразовывать положение ручки в целое значение в допустимом диапазоне.

Слайдер бывает горизонтальным и вертикальным

```python
self.slider.setOrientation(Qt.Orientation.Horizontal)
```

Настройка положения галочки ползунка

```python
self.slider.setTickPosition(QSlider.TickPosition.TicksAbove)
```

Интервал шага

```python
self.slider.setTickInterval(5)
```

Границы диапазона

```python
self.slider.setMinimum(0) 
self.slider.setMaximum(100) 
```

Методы

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-set" style="width: 103.214%;"><thead><tr><td class="align-center" style="width: 21.5873%;">**Метод**</td><td class="align-center" style="width: 78.4127%;">**Назначение**</td></tr></thead><tbody><tr><td style="width: 21.5873%;">minimum()</td><td style="width: 78.4127%;">возвращает минимальное значение ползунка</td></tr><tr><td style="width: 21.5873%;">maximum()</td><td style="width: 78.4127%;">возвращает максимальное значение ползунка</td></tr><tr><td style="width: 21.5873%;">setValue()</td><td style="width: 78.4127%;">используется для установки значения ползунка</td></tr></tbody></table>

Сигналы

<table border="1" id="bkmrk-%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-va" style="width: 103.214%; height: 89.3907px;"><thead><tr style="height: 29.7969px;"><td class="align-center" style="width: 21.5873%; height: 29.7969px;">**Сигнал**</td><td class="align-center" style="width: 78.4127%; height: 29.7969px;">**Назначение**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 21.5873%; height: 29.7969px;">valueChanged()</td><td style="width: 78.4127%; height: 29.7969px;">подается при перемещении ручки ползунка</td></tr><tr style="height: 29.7969px;"><td style="width: 21.5873%; height: 29.7969px;">sliderPressed()</td><td style="width: 78.4127%; height: 29.7969px;">подается, когда пользователь начинает перетаскивать ручку ползунка. </td></tr><tr><td style="width: 21.5873%;">sliderMoved()</td><td style="width: 78.4127%;">подается, когда пользователь перемещает ручку ползунка.</td></tr><tr><td style="width: 21.5873%;">sliderReleased()</td><td style="width: 78.4127%;">подается, когда пользователь отпускает ручку ползунка</td></tr></tbody></table>

**QListWidget**

QListWidget - представление списка, аналогичное QListView, но с классическим интерфейсом на основе элементов для добавления и удаления элементов. QListWidget использует внутреннюю модель для управления удалением элементов. QListWidget использует внутреннюю модель для управления каждым QListWidgetItem в списке.

Методы

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-ins" style="width: 103.214%;"><thead><tr><td class="align-center" style="width: 21.5873%;">**Метод**</td><td class="align-center" style="width: 78.4127%;">**Назначение**</td></tr></thead><tbody><tr><td style="width: 21.5873%;">insertItem()</td><td style="width: 78.4127%;">вставляет новый элемент в виджет списка в указанном месте. </td></tr><tr><td style="width: 21.5873%;">insertItems()</td><td style="width: 78.4127%;">вставляет несколько элементов из предоставленного списка, начиная с указанного места </td></tr><tr><td style="width: 21.5873%;">count()</td><td style="width: 78.4127%;">возвращает количество элементов в списке. </td></tr><tr><td style="width: 21.5873%;">takeItem()</td><td style="width: 78.4127%;">удаляет и возвращает элементы из указанной строки</td></tr><tr><td style="width: 21.5873%;">CurrentItem()</td><td style="width: 78.4127%;">возвращает текущий элемент в списке</td></tr><tr><td style="width: 21.5873%;">addItem()</td><td style="width: 78.4127%;">добавляет элемент с указанным текстом в конец</td></tr><tr><td style="width: 21.5873%;">currentRow()</td><td style="width: 78.4127%;">возвращает номер строки выбранного элемента. Если ни один элемент не выбран, возвращает -1</td></tr></tbody></table>

Сигналы

<table border="1" id="bkmrk-%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-cl" style="width: 103.214%; height: 148.984px;"><thead><tr style="height: 29.7969px;"><td class="align-center" style="width: 21.5873%; height: 29.7969px;">**Сигнал**</td><td class="align-center" style="width: 78.4127%; height: 29.7969px;">**Назначение**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 21.5873%; height: 29.7969px;">clicked()</td><td style="width: 78.4127%; height: 29.7969px;">подается при щелчке по элементу в виджете списка </td></tr><tr style="height: 29.7969px;"><td style="width: 21.5873%; height: 29.7969px;">currentRowChanged()</td><td style="width: 78.4127%; height: 29.7969px;">подается при изменении строки текущего элемента списка</td></tr><tr style="height: 29.7969px;"><td style="width: 21.5873%; height: 29.7969px;">currentTextChanged()</td><td style="width: 78.4127%; height: 29.7969px;">подается при каждом изменении текста в текущем элементе списка</td></tr><tr style="height: 29.7969px;"><td style="width: 21.5873%; height: 29.7969px;">currentItemChanged()</td><td style="width: 78.4127%; height: 29.7969px;">подается при изменении фокуса текущего элемента списка</td></tr></tbody></table>

# QT6 QTable, QMessageBox, Dialogs

**QTable**

Отображение таблиц. Элементы в QTableWidget предоставляются с помощью QTableWidgetItem.

Методы:

<table border="1" id="bkmrk-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-set" style="width: 102.143%;"><colgroup><col style="width: 17.8821%;"></col><col style="width: 82.1179%;"></col></colgroup><thead><tr><td class="align-center">**Метод**</td><td class="align-center">**Назначение**</td></tr></thead><tbody><tr><td>setRowCount()</td><td>определения количества строк</td></tr><tr><td>setColumnCount()</td><td>определения количества столбцов</td></tr><tr><td>rowCount()</td><td>возвращает количество строк</td></tr><tr><td>columnCount()</td><td>возвращает количество столбцов</td></tr></tbody></table>

```python
from PyQt6.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QVBoxLayout
import sys 
 
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200, 700, 400)
        self.setWindowTitle("Python GUI Development")
        self.create_button()

    def create_button(self):
        vbox = QVBoxLayout()
        curtable = QTableWidget()
        curtable.setRowCount(3)
        curtable.setColumnCount(3)

        curtable.setItem(0, 0, QTableWidgetItem('Заголовок столбца 1'))
        curtable.setItem(0, 1, QTableWidgetItem('Заголовок столбца 2'))
        curtable.setItem(0, 2, QTableWidgetItem('Заголовок столбца 3'))

        vbox.addWidget(curtable)

        self.setLayout(vbox)
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec())
```

**QMessageBox**

QMessageBox - модальный диалог информирования пользователя и получения ответа. В окне сообщения отображается текст, есть необязательный подробный текст в случае необходимости. Также может отображаться значок и стандартные кнопки для принятия ответа пользователя. Существуют различные типы диалогов (about messagebox, information messagebox, warning messagebox, multichoice messagebox).

```python
from PyQt6.QtWidgets import QApplication, QDialog, QPushButton
from PyQt6.QtWidgets import QMessageBox

from PyQt6 import uic
import sys 
 
class Window(QDialog):
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200, 700, 400)
        self.setWindowTitle("Python GUI Development")
        uic.loadUi("messagedemo.ui", self)
        
        self.loadguiobjects()

    def loadguiobjects(self):
        self.butt_warn = self.findChild(QPushButton, "pushButton_warn")
        self.butt_warn.clicked.connect(self.show_warn)
        self.butt_info = self.findChild(QPushButton, "pushButton_info")
        self.butt_info.clicked.connect(self.show_info)
        self.butt_abt = self.findChild(QPushButton, "pushButton_abt")
        self.butt_abt.clicked.connect(self.show_about)

    def show_warn(self):
        QMessageBox.warning(self, 'Warning', 'This is a warning message')
    
    def show_info(self):
        #кастомный messagebox + стандартные кнопки
        msg_box = QMessageBox(self)
        msg_box.setWindowTitle('Information')
        msg_box.setText('This is a information message')
        msg_box.setIcon(QMessageBox.Icon.Information)

        # Добавляем кнопки
        ok_button = msg_box.addButton('OK', QMessageBox.ButtonRole.AcceptRole)
        cancel_button = msg_box.addButton('Отменить задание', QMessageBox.ButtonRole.RejectRole)

        # Показываем сообщение и ждем нажатия кнопки
        msg_box.exec()

        # Проверяем какая кнопка была нажата
        if msg_box.clickedButton() == cancel_button:
            print("Действие отменено")

        elif msg_box.clickedButton() == ok_button:
            print("OK нажата")

    def show_about(self):
        # другой способ с разными кнопкам
        msg_box = QMessageBox(
            QMessageBox.Icon.NoIcon,
            'About',
            'This is a about message',
            QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel
        )

        # Изменяем текст стандартных кнопок
        msg_box.button(QMessageBox.StandardButton.Ok).setText('Продолжить')
        msg_box.button(QMessageBox.StandardButton.Cancel).setText('Отменить задание')

        result = msg_box.exec()

        if result == QMessageBox.StandardButton.Ok:
            print("Продолжаем выполнение")
        else:
            print("Задание отменено")
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec())
```

**SaveFile**

Сама кнопка меню в сформированном из QtDesiner, класс Ui\_MainWindow

```python
from PyQt6.QtWidgets import QMainWindow, QApplication, QFileDialog, QMessageBox
import sys
from notepadapp import Ui_MainWindow

class NotePadWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()

        self.actionSave.triggered.connect(self.save_file)

    def save_file(self):
        filename = QFileDialog.getSaveFileName(self, 'Save file')
        if filename[0]:
            f = open(filename[0], 'w')
            with f:
                text = self.textEdit.toPlainText()
                f.write(text)
                QMessageBox.about(self, 'Save file', 'File saved successfully!')

app = QApplication(sys.argv)
Note = NotePadWindow()
sys.exit(app.exec())
```

# Пример: notepad

**Начальная информация**

Внешний вид приложения:

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/XJIimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/XJIimage.png)

Элементы интерфейса: меню, быстрые кнопки и многострочное поле ввода. Элементы меню:

<table border="1" id="bkmrk--1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr><td>[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/37qimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/37qimage.png)

</td><td>[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/69timage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/69timage.png)

</td><td>[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2026-02/scaled-1680-/YRWimage.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-02/YRWimage.png)

</td></tr></tbody></table>

**Установленные модули:**

```bash
pip install pyqt6
```

Параметры интерфейса:

Окно - MainWindow

```python
from PyQt6.QtWidgets import QMainWindow, QApplication, QFileDialog, QMessageBox
from PyQt6.QtPrintSupport import QPrinter, QPrintDialog, QPrintPreviewDialog
from PyQt6.QtCore import QFileInfo
from PyQt6.QtGui import QFont
import sys
from notepadapp import Ui_MainWindow

class NotePadWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()

        self.actionSave.triggered.connect(self.file_save)
        self.actionNew.triggered.connect(self.file_new)
        self.actionOpen.triggered.connect(self.file_open)
        self.actionPrint.triggered.connect(self.file_print)
        self.actionPrint_preview.triggered.connect(self.preview_dialog)
        self.actionExport_PDF.triggered.connect(self.exporting_pdf)
        self.actionQuit.triggered.connect(self.exit_app)

        self.actionUndo.triggered.connect(self.textEdit.undo)
        self.actionRedo.triggered.connect(self.textEdit.redo)

        self.actionCut.triggered.connect(self.textEdit.cut)
        self.actionCopy.triggered.connect(self.textEdit.copy)
        self.actionPaste.triggered.connect(self.textEdit.paste)

        self.actionBold.triggered.connect(self.text_bold)

    def maybe_save(self) -> bool:
        if not self.textEdit.document().isModified():
            return True
        
        ret = QMessageBox.warning(self, "Application", 
                                  "The document changed \n Save working?",
                                  QMessageBox.StandardButton.Save | 
                                  QMessageBox.StandardButton.Discard | 
                                  QMessageBox.StandardButton.Cancel)
        if ret == QMessageBox.StandardButton.Save:
            self.file_save()
            return True
        elif ret == QMessageBox.StandardButton.Cancel:
            return False
        
        return True
    
    def file_new(self):
        if self.maybe_save():
            self.textEdit.clear()

    def file_save(self):
        filename = QFileDialog.getSaveFileName(self, 'Save file')
        if filename[0]:
            f = open(filename[0], 'w')
            with f:
                text = self.textEdit.toPlainText()
                f.write(text)
                QMessageBox.about(self, 'Save file', 'File saved successfully!')

    def file_open(self):
        self.maybe_save()
        filename = QFileDialog.getOpenFileName(self, 'Open file')
        if filename[0]:
            f = open(filename[0], 'r')
            with f:
                data = f.read()
                self.textEdit.setText(data)

    def file_print(self):
        printer = QPrinter(QPrinter.PrinterMode.HighResolution)
        dialog = QPrintDialog(printer)
        if dialog.exec() == QPrintDialog.DialogCode.Accepted:
            self.textEdit.print(printer)

    def print_preview(self, printer):
        self.textEdit.print(printer)

    def preview_dialog(self):
        printer = QPrinter(QPrinter.PrinterMode.HighResolution)
        preview_dialog = QPrintPreviewDialog(printer, self)
        preview_dialog.paintRequested.connect(self.print_preview)
        preview_dialog.exec()

    def exporting_pdf(self):
        #fn, _ = QFileDialog.getSaveFileName(self, 'Export PDF', "PDF Files (.pdf) ;; AllFiles()")
        fn, _ = QFileDialog.getSaveFileName(self, 'Export PDF','',"PDF Files (.pdf) ;; All Files (*)")
        if QFileInfo(fn).suffix() == "":
            fn += '.pdf'
        printer = QPrinter(QPrinter.PrinterMode.HighResolution)
        printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)
        printer.setOutputFileName(fn)
        self.textEdit.document().print(printer)

    def exit_app(self):
        self.close()

    def text_bold(self):
        font = QFont()
        font.setBold(True)
        self.textEdit.setFont(font)


app = QApplication(sys.argv)
Note = NotePadWindow()
sys.exit(app.exec())
```

Это неполный код, операции однотипные.

# QT6: База данных

Пример для работы с Mysql

```bash
pip install mysql-connector-python
```

Пример кода для подключения к базе и создания БД:

```python
from PyQt6 import QtCore, QtGui, QtWidgets
import mysql.connector as mc


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(456, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_dbname = QtWidgets.QLabel(parent=Form)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label_dbname.setFont(font)
        self.label_dbname.setObjectName("label_dbname")
        self.horizontalLayout.addWidget(self.label_dbname)
        self.lineEdit_dbname = QtWidgets.QLineEdit(parent=Form)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.lineEdit_dbname.setFont(font)
        self.lineEdit_dbname.setText("")
        self.lineEdit_dbname.setObjectName("lineEdit_dbname")
        self.horizontalLayout.addWidget(self.lineEdit_dbname)
        self.verticalLayout.addLayout(self.horizontalLayout)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.pushButton_dbcreate = QtWidgets.QPushButton(parent=Form)
        self.pushButton_dbcreate.setObjectName("pushButton_dbcreate")
        self.pushButton_dbcreate.clicked.connect(self.create_db)
        self.horizontalLayout_2.addWidget(self.pushButton_dbcreate)
        self.pushButton_dbconn = QtWidgets.QPushButton(parent=Form)
        self.pushButton_dbconn.setObjectName("pushButton_dbconn")
        self.pushButton_dbconn.clicked.connect(self.check_connect)
        self.horizontalLayout_2.addWidget(self.pushButton_dbconn)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.label_result = QtWidgets.QLabel(parent=Form)
        font = QtGui.QFont()
        font.setFamily("PMingLiU-ExtB")
        font.setPointSize(14)
        self.label_result.setFont(font)
        self.label_result.setText("")
        self.label_result.setObjectName("label_result")
        self.verticalLayout.addWidget(self.label_result)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def create_db(self):
        try:
            mydb = mc.connect(
                host="192.168.1.193",
                user="root",
                password="rootpassword"
            )
            cursor = mydb.cursor()
            dbname = self.lineEdit_dbname.text()
            cursor.execute("CREATE DATABASE {} ".format(dbname))
            self.label_result.setText('Database {} created!'.format(dbname))
        except mc.Error as e:
            self.label_result.setText(str(e))

    def check_connect(self):
        try:
            mydb = mc.connect(
                host="192.168.1.193",
                user="root",
                password="rootpassword",
                database="pyqtdb"
            )
            self.label_result.setText("Connected!")
        except mc.Error as e:
            self.label_result.setText(str(e))

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label_dbname.setText(_translate("Form", "Database name:"))
        self.pushButton_dbcreate.setText(_translate("Form", "Create Database"))
        self.pushButton_dbconn.setText(_translate("Form", "Database connection"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec())
```