Введение
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
-
Установите
qt5-tools
(для PyQt) или используйте Qt Installer (для PySide) -
Создайте
.ui
файл через drag-and-drop -
Конвертируйте в 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 |
Мощная сцена для отрисовки объектов, подходит для анимаций и редакторов. |
Пример простого окна
Для PySide2/PySide6 используйте: from PySide2.QtWidgets import ...
и app.exec()
Установка
PyQt5:
PySide2 (официальная от Qt):
PyQt6 / PySide6 также доступны, но требуют небольших изменений в импортах (например, exec()
вместо exec_()
).
Отличия PyQt и PySide
Параметр | PyQt | PySide |
---|---|---|
Лицензия | GPL / коммерческая | LGPL (более свободная) |
Разработка | Riverbank | Qt (официальная поддержка) |
Сигналы | pyqtSignal , pyqtSlot |
Signal , Slot |
Совместимость | Почти идентичны по API | Почти идентичны по API |
Заключение
PyQt и PySide — это зрелые инструменты для создания мощных и красивых графических интерфейсов. Выбор между ними зависит от лицензии, целей и предпочтений. Оба фреймворка обеспечивают полный доступ к возможностям Qt, включая работу с QML, кастомные стили и высокую производительность.