# 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

```