PyQt/PySide – разработка десктопных приложений

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

PyQt и PySide — это библиотеки для создания кроссплатформенных графических интерфейсов на Python с использованием фреймворка Qt. Они предоставляют доступ к мощным инструментам Qt: виджетам, системам событий, стилям, анимациям и даже QML.

Главное отличие между PyQt и PySide — лицензия: PyQt требует GPL или коммерческую лицензию, а PySide (официальная реализация от Qt) распространяется под более либеральной LGPL.

В этом руководстве мы рассмотрим создание интерфейсов, обработку событий, структуры проектов, стилизацию, сборку в .exe и сравнение между PyQt и PySide.


Установка

PyQt5:

pip install pyqt5

PySide6:

pip install pyside6

Простое окно с кнопкой

PyQt

from PyQt5.QtWidgets import QApplication, QPushButton
import sys

app = QApplication(sys.argv)
button = QPushButton('Нажми меня')
button.show()
sys.exit(app.exec_())

PySide

from PySide6.QtWidgets import QApplication, QPushButton
import sys

app = QApplication(sys.argv)
button = QPushButton('Нажми меня')
button.show()
sys.exit(app.exec())

Структура приложения Qt

  • QApplication — главный цикл событий

  • QWidget — базовый элемент интерфейса

  • QMainWindow — главное окно с меню и статусбаром

  • QDialog — модальные окна


Сигналы и слоты

Подключение сигнала к методу

button.clicked.connect(self.on_click)
def on_click(self):
    print("Кнопка нажата")

Популярные виджеты

  • QPushButton, QLabel, QLineEdit

  • QComboBox, QCheckBox, QRadioButton

  • QTableWidget, QListWidget

  • QSlider, QProgressBar

  • QDialog, QMessageBox


Стилизация интерфейса (CSS/Qt Style Sheets)

button.setStyleSheet("background-color: green; color: white; font-size: 16px")

Построение интерфейса в Qt Designer

  1. Установите qt5-tools (для PyQt) или используйте Qt Installer (для PySide)

  2. Создайте .ui файл через drag-and-drop

  3. Конвертируйте в Python:

pyuic5 myform.ui -o myform.py

Для PySide:

pyside6-uic myform.ui -o myform.py

Работа с QML

QML — декларативный язык для современных UI

Rectangle {
    width: 300; height: 300
    Text { text: "Привет, QML!" }
}

Запуск через QQmlApplicationEngine.


Сборка в .exe с помощью PyInstaller

pyinstaller --onefile main.py

Добавьте:

import sys
if hasattr(sys, '_MEIPASS'):
    # путь к ресурсам в exe

Сравнение PyQt и PySide

Параметр PyQt5 PySide6
Лицензия GPL / коммерческая LGPL
Поддержка QML Да Да
Официальная поддержка Нет Да (Qt Company)
Инструменты Designer pyqt5-tools встроено в Qt Creator

Практические проекты

  • Менеджер задач

  • RSS-читалка

  • Визуализатор данных (с matplotlib)

  • GUI для скриптов и API

  • Умный калькулятор с историей

Описание всех ключевых компонентов PyQt / PySide для создания GUI на Python

Основы и структура приложения

Компонент Описание
QApplication Главный объект приложения. Обрабатывает события и запускает цикл.
QMainWindow Основное окно приложения с поддержкой меню, панели инструментов и статуса.
QWidget Базовый класс для всех элементов интерфейса. Может быть как контейнером, так и самостоятельным виджетом.
QDialog Окно диалога (всплывающее). Используется для подтверждений, настроек и т.д.
QLayout Абстрактный контейнер для компоновки элементов: QVBoxLayout, QHBoxLayout, QGridLayout.
QTimer Таймер для периодических или отложенных событий.

Виджеты (интерфейсные элементы)

Класс Описание
QLabel Метка для текста или изображения.
QPushButton Кнопка.
QLineEdit Однострочное текстовое поле.
QTextEdit Многострочное текстовое поле.
QCheckBox Флажок (чекбокс).
QRadioButton Переключатель (радио-кнопка).
QComboBox Выпадающий список.
QSpinBox / QDoubleSpinBox Поле с числовым вводом.
QSlider Ползунок (горизонтальный или вертикальный).
QProgressBar Индикатор выполнения.
QTableWidget Таблица с редактируемыми ячейками.
QListWidget Список с элементами.
QTreeWidget Иерархический список (дерево).

Работа с событиями и сигналами

Понятие Описание
Сигналы и слоты Механизм связи событий и функций. Например: button.clicked.connect(self.on_click)
connect() Метод для привязки сигнала к обработчику.
emit() Метод для генерации пользовательского сигнала.
@pyqtSlot / @Slot Декоратор для слотов (обработчиков сигналов).

Работа с окнами и навигацией

Класс Описание
QStackedWidget Переключение между несколькими страницами (stack-подобный интерфейс).
QTabWidget Окно с вкладками.
QSplitter Разделитель между панелями, который можно перемещать.
QDockWidget Док-панели (можно закреплять сбоку).

Работа с файлами

Класс / Метод Описание
QFileDialog.getOpenFileName() Открытие файла.
QFileDialog.getSaveFileName() Сохранение файла.
QFileDialog.getExistingDirectory() Выбор директории.

Работа с графикой

Класс Описание
QPixmap Картинка для отображения в QLabel.
QImage Изображение для обработки.
QPainter Класс для рисования (линий, фигур, текста).
QGraphicsView, QGraphicsScene, QGraphicsItem Мощная сцена для отрисовки объектов, подходит для анимаций и редакторов.

Пример простого окна

python
from PyQt5.QtWidgets import QApplication, QLabel, QWidget app = QApplication([]) window = QWidget() window.setWindowTitle('Пример PyQt') label = QLabel('Привет, PyQt!', parent=window) label.move(60, 40) window.resize(200, 100) window.show() app.exec_()

Для PySide2/PySide6 используйте: from PySide2.QtWidgets import ... и app.exec()


Установка

PyQt5:

bash
pip install PyQt5

PySide2 (официальная от Qt):

bash
pip install PySide2

PyQt6 / PySide6 также доступны, но требуют небольших изменений в импортах (например, exec() вместо exec_()).


Отличия PyQt и PySide

Параметр PyQt PySide
Лицензия GPL / коммерческая LGPL (более свободная)
Разработка Riverbank Qt (официальная поддержка)
Сигналы pyqtSignal, pyqtSlot Signal, Slot
Совместимость Почти идентичны по API Почти идентичны по API

Заключение

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