Полное руководство по PyQt5: создание профессиональных GUI на Python
Что такое PyQt?
PyQt — Python-биндинг для фреймворка Qt, кроссплатформенной C++ библиотеки для создания нативных GUI-приложений на Windows, macOS, Linux, Android, iOS, Raspberry Pi и других. Биндинг поддерживается Riverbank Computing (UK), а сам Qt разрабатывается The Qt Company (Финляндия). PyQt даёт Python-разработчикам доступ к богатому набору виджетов Qt, сетевым возможностям, базам данных, 3D и мультимедиа.
В этом туториале вы узнаете:
- Ключевые фичи PyQt5
- Доступные версии PyQt
- Как установить PyQt5 на Windows, macOS и Linux
- Фундаментальные концепции PyQt и примеры программ
- Основные компоненты и виджеты
- Стратегии компоновки и кастомизация тем
Ключевые фичи PyQt5
PyQt5 предоставляет более 600 классов, охватывающих:
- Графические пользовательские интерфейсы
- SQL-интеграцию с базами данных (SQLite, MySQL, PostgreSQL, Oracle, ODBC)
- Веб-рендеринг через QtWebEngine
- XML-парсинг и манипуляции
- Надёжную сетевую поддержку (TCP/UDP, SSL, DNS)
- Мультимедиа и 3D-графику (QtMultimedia, Qt3D)
Эти возможности позволяют создавать сложные, высокопроизводительные десктопные и встраиваемые приложения. Крупные корпорации вроде LG, Mercedes-Benz, AMD, Panasonic и Harman полагаются на Qt для своих UI-стеков.
Версии PyQt
Riverbank Computing предлагает два основных биндинга:
- PyQt4 — поддерживает модули Qt 4.x и Qt 5.x (не обратно совместим)
- PyQt5 — биндинги исключительно для Qt 5.x
Дополнительно PyQt3D предоставляет Python-биндинги для фреймворка Qt3D, полезного для рендеринга в реальном времени и симуляций.
Установка PyQt5
Описаны два распространённых метода установки. Рекомендуется использовать wheel-пакеты, так как они включают скомпилированные C++ бинарники и избегают длительных процессов сборки.
Метод 1: Установка через Wheels (рекомендуется)
- Откройте терминал или командную строку.
- Выполните
pip install PyQt5для скачивания wheel (~50 МБ). - Убедитесь, что установка прошла успешно.
Пример на Windows:
pip install PyQt5
После установки можно импортировать PyQt5.QtWidgets и начинать создавать приложения.
Метод 2: Сборка из исходников
Сборка из исходников сложнее, так как компилирует C++ код. Необходима только если нужны кастомные модификации или wheel для вашей платформы недоступен.
Основы программирования на PyQt5
Ниже — минимальный пример, открывающий окно 300×300 с заголовком «Guru99». Каждая строка прокомментирована.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
w.show()
sys.exit(app.exec_())
Пояснение:
QApplication— ядро цикла событий.QWidget— базовый класс для всех UI-компонентов.resize()— задаёт размеры окна.setWindowTitle()— определяет текст заголовка.show()— отображает виджет.app.exec_()— запускает цикл событий и блокирует до закрытия окна.
Добавление интерактивности
Следующий пример добавляет метку, кнопку и сообщение, появляющееся при клике. Демонстрирует сигналы и слоты — ядро событийной системы Qt.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
def dialog():
mbox = QMessageBox()
mbox.setText("Your allegiance has been noted")
mbox.setDetailedText("You are now a disciple and subject of the all‑knowing Guru")
mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
mbox.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
label = QLabel("Behold the Guru, Guru99", w)
label.move(100, 130)
btn = QPushButton("Beheld", w)
btn.move(110, 150)
btn.clicked.connect(dialog)
w.show()
sys.exit(app.exec_())
Клик по кнопке вызывает dialog(), создающий модальный QMessageBox.
Основные компоненты и виджеты
Архитектура PyQt5 организована в несколько модулей. Понимание иерархии помогает импортировать только необходимое.
Обзор модулей
- Qt — агрегирует все под-модули; удобен для маленьких скриптов.
- QtCore — ядро non-GUI классов (сигналы, слоты, таймеры).
- QtWidgets — стандартные GUI-виджеты (кнопки, метки и т.д.).
- QtGui — графические примитивы и продвинутая рисовка.
- QtNetwork — TCP/UDP сокеты, SSL, DNS.
- QtMultimedia — аудио/видео поддержка.
- QtSql — интеграция с базами данных.
Частые виджеты
QLineEdit— однострочный ввод текста.QRadioButton— переключатель (radio button).QComboBox— выпадающий селектор.QCheckBox— чекбокс.QMenuBar— горизонтальная меню-бар.QToolBar— тулбар с кнопками.QTabWidget— вкладки.QScrollBar— скроллбар.QSplitter— ресайзируемый сплит-вью.QDockWidget— открепляемая док-панель.
Управление компоновкой (Layout Management)
Вместо ручного позиционирования виджетов через move() и resize(), Qt предлагает менеджеры компоновки, автоматически расставляющие виджеты в зависимости от размера окна.
Box Layouts (HBox & VBox)
QHBoxLayout располагает виджеты горизонтально; QVBoxLayout — вертикально.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
app = QApplication([])
win = QWidget()
win.setWindowTitle("Musketeers")
btn1 = QPushButton("Athos")
btn2 = QPushButton("Porthos")
btn3 = QPushButton("Aramis")
hbox = QHBoxLayout(win)
hbox.addWidget(btn1)
hbox.addWidget(btn2)
hbox.addWidget(btn3)
win.show()
app.exec_()
Замените QHBoxLayout на QVBoxLayout для вертикального стека кнопок.
Grid Layout (Сеточная компоновка)
Организует виджеты в 2D-сетку. Метод addWidget() принимает индексы строки и столбца плюс опциональные row-span и column-span.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication([])
win = QWidget()
layout = QGridLayout(win)
for i in range(3):
for j in range(3):
layout.addWidget(QPushButton(f"Button {i},{j}"), i, j)
win.show()
app.exec_()
Кастомные темы и стили
PyQt5 поддерживает нативные темы и кастомные стили.
Встроенные темы
Установите стиль приложения с app.setStyle("Fusion") или любой другой доступный стиль.
app = QApplication([])
app.setStyle("Fusion")
Кастомизация палитры
Используйте QPalette для программного изменения цветов виджетов.
from PyQt5.QtGui import QPalette from PyQt5.QtCore import Qt palette = QPalette() palette.setColor(QPalette.ButtonText, Qt.black) palette.setColor(QPalette.Window, Qt.black) palette.setColor(QPalette.Button, Qt.gray) app.setPalette(palette)
Qt Style Sheets (CSS-подобные)
Для продвинутого стилизирования применяйте stylesheets напрямую к виджетам или всему приложению.
btn.setStyleSheet("background-color: #4CAF50; color: white; padding: 5px;")
Ключевые выводы
- PyQt5 — мощный Python-биндинг для Qt, подходящий для кроссплатформенных десктопных, встраиваемых и мобильных приложений.
- Установка лучше всего через wheels; сборка из исходников опциональна.
- Ключевые модули: QtCore, QtGui, QtWidgets, QtNetwork, QtMultimedia, QtSql.
- Виджеты включают кнопки, метки, текстовые поля, радиокнопки, чекбоксы, меню, тулбары, вкладки, сплиттеры, доки.
- Интерактивность опирается на механизм сигналов и слотов Qt.
- Layouts — Box и Grid — автоматизируют размещение виджетов, улучшая отзывчивость.
- Темизация достижима через встроенные стили, палитры или Qt Style Sheets.
- Qt Designer и Qt Creator ускоряют дизайн UI и упаковку приложений.
Python
- Коллекции в C#: практическое руководство с реальными примерами
- Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами
- Мастерство строк форматирования format() в Python: понятные примеры
- Мастерство метода String.find() в Python: синтаксис, примеры и альтернативы
- Освоение лямбда-функций Python: практические примеры и лучшие практики
- Функция round() в Python: подробное объяснение с практическими примерами
- Освоение функции map() в Python: синтаксис, примеры и лучшие практики
- Python timeit(): измерение времени выполнения с практическими примерами
- Counter в collections Python: эффективное подсчёт, обновление и арифметические операции
- Понимание type() и isinstance() в Python: практические примеры