- PVSM.RU - https://www.pvsm.ru -
В этой статье я попытаюсь рассказать вам о прекрасной библиотеки PySide (которая является биндингом Qt) на языке Python.
Так же существует популярный неофициальный аналог - PyQt. Я не рекомендую его использовать по многим причинам, из которых например не подходящая лицензия для коммерческого использования (GPL, в отличии от LGPL), а так же отсутствие дополнительных приложений и пакетов.
Мы будем использовать самую новую версию PySide6 (по состоянию на 2025 год) и Python с официального сайта
Так же существуют устаревшие версии PySide:
PySide1 (Qt 4)
PySide2 (Qt 5)
PySide6 (Qt 6) актуальная версия
Python (https://www.python.org/downloads/ [1])
Удобная IDE/редактор кода (Visual Studio Code или PyCharm)
Сам PySide6 - «pip install PySide6»
Знания ООП (хотябы минимальные)
Перед началом поделюсь ссылкой с официальной документацией, если появятся какие-либо вопросы, ответы на которые нет в данной статье.
Qt for Python (PySide6) - https://doc.qt.io/qtforpython-6/ [2]
Полная документация Qt - https://doc.qt.io/ [3]
Qt Wiki - https://wiki.qt.io/Main [4]
После установки PySide6 можно приступать к изучению.
Для начала хотелось бы рассказать что такое Qt в целом.
Qt представляет кроссплатформенный фреймворк для создания графических приложений для десктопа, мобильных и встроенных устройств. Он предоставляет разработчикам отличный набор инструментов для проектирования и создания отличных приложений, не беспокоясь о зависимости от платформы.
Сам оригинальный Qt создан для C++ а PySide6 испольняет роль "биндинга" (привязки) то есть мы пишем на Python а сама библиотека написана на С++ (внутри используется shiboken6 [5], который помогает использовать C++ код в Python)
С помощью Qt можно создать много разных приложений.
С помощью данного фреймворка написаны такие популярные приложения:
Telegram (!)
qBittorrent
VLC Media Player
OBS Studio
VirtualBox
и много других
* Стоит учитывать что они написаны именно на оригинальном C++/Qt а не Python/Qt
Ну что же, напишем первое приложение.
Совет: Используйте «pyside6-project [6]» для создания нового проекта PySide6 с готовой системой каталогов
В данном случае мы создадим проект вручную.
Создаю папку testapp в ней main.py
Импортируем библиотеку
from PySide6.QtWidgets import QApplication, QLabel
app = QApplication()
label = QLabel("Hello, World!")
label.show()
app.exec()
Совет: в некоторых туториалах могут использоваться старые способы. Например sys.exit(app.exec()), QApplication(sys.argv), и т.д. В новых версиях Qt данные телодвижения не требуются, всё делается автоматически.
Запускаем, получаем окно с надписью Hello, World!
В данном случае мы создаём экземпляр приложения (QApplication), добавляем к нему виджет "label" (текст), показываем этот виджет и запускаем приложение.
Позже в данной статье я расскажу о QMainWindow, QWidget и centralWidget.

Qt Designer — это визуальный инструмент для разработки пользовательских интерфейсов (GUI) в рамках фреймворка Qt. Он позволяет создавать окна, формы и виджеты с помощью drag-and-drop, без необходимости писать код вручную.
Данное приложение очень помогает при разработке приложений, позволяет настраивать элементы окна и много чего, чего даже я не знаю
Совет: вы можете изменить тему приложения (не только белую и черную, а и другие) используя параметр -style (пример: pyside6-designer -style WindowsVista). Подробнее про стили мы поговорим позже.
Я рекомендую использовать встроенное в приложение в PySide6 приложение используя команду pyside6-designer, это ярлык. Настоящее приложение находиться в вашей папке site-packages/PySide6/designer.exe
Вы можете скачать его используя полный пакет Qt, в котором так же есть IDE для разработки Qt приложний с поддержкой Python - Qt Creator. Если честно, мне не понравилась данная идея. Пакет PySide6 имеет всё что нужно.
Ещё вариант скачать скомпилированный автономный вариант - https://build-system.fman.io/qt-designer-download [7]

Главное окно вашего приложения можно создать с помощью класса QMainWindow, внутрь данного окна помещается главный виджет - centralWidget в котором находятся другие виджеты, кнопки, меню, и всё что вы туда добавите.
Совет: в примере приложение Hello, World! мы не создавали окно приложения и просто показывали виджет. Чтобы показывать несколько виджетов нужно показывать каждый виджет отдельно (не практично, не используется) или создать окно, в которое будут помещаться ваши виджеты (лучший вариант)
QWidget позволяет создавать свои кастомные виджеты, с другими виджетами, настройками и т.д.
QCentralWidget наследуется от QWidget и является главным виджетом окна. Для него используется Layout (QLayout или просто компоновщик) который позволяет правильно распологать виджеты и даёт возможность их перемещать при изменении размера окна.
Совет: если вы выбирите QWidget как главное окно вашего приложения, то вы не сможете изменить название окна, иконку, а также другие параметры. Используйте QMainWindow
Так же существует menuBar. Как все привыкли - Файл, Правка, Свойства. Контекстное меню вверху окна.
Внизу - statusBar где может помещаться разная информация.
toolBar - панель инструментов, где можно быстро что-то вызвать или использовать.
DockWidget — это виджет который используется для создания "плавающих" панелей вокруг главного окна. Такие панели можно перетаскивать, закреплять сбоку, скрывать и снова показывать.

Заходим, выбираем стандартные параметры (MainWindow), нажимаем «Создать». Попадаем в главное окно редактора. Слева встречает окно с виджетами, справа управлениями свойствами. Вы можете перемещать эти панели как хотите, а так же убирать их.
Для примера давайте создадим приложение которое позволяет генерировать случайные числа
Перемещаем QLayout например на центр, а QPushButton вниз. Справа находим редактор объектов и для centralWidget выбираем layout используя панель слева вверху (панель инструментов). Можно сделать горизонтально, вертикально и так далее.
Форма -> Предпросмотр. Видим как приложение выглядит. Сохраняем .ui в папку проекта.
После сохранения интерфейса мы сохраняем файл .ui
По сути это XML файл с настройками интерфейса который принимает Qt. Для простых примеров его можно динамически загружать, но в больших это не рекомендуется. Его нужно переводить в Python код. Для этого использует утилита pyside6-uic
pyside6-uic design.ui -o design.py
Появится design.py файл с готовым классом приложения и его настройками.
В главном файле импортируем его:
from design import Ui_MainWindow
После этого мы можем запустить интерфейс. Для теста:
from PySide6.QtWidgets import QApplication, QMainWindow
from design import Ui_MainWindow
app = QApplication()
window = QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(window)
window.show()
app.exec()
Запускаем. Проверяем. Видим интерфейс.
Допустим, есть кнопка. Когда ты на неё жмёшь, она посылает сигнал.
А если ты сказал: "Когда кнопка нажата — вызови функцию say_hi()", то say_hi() — это слот, который сработает в ответ на сигнал.
Сами слоты мы должны писать в коде, по сути это просто функции.
Обозначить слоты можно в Designer-е, но не обязательно.
Прошлый пример только для тестирования что всё работает. Для нормального приложения мы должны создать класс:
from PySide6.QtWidgets import QApplication, QMainWindow
from design import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
def main():
app = QApplication()
window = MainWindow()
window.show()
app.exec()
if __name__ == "__main__":
main()
Видим - всё работает. Создаём сигналы и слоты. Спросите, как? Всё просто, создаём функции в классе MainWindow.
Например:
import random
def generate_number(self):
number = random.randint(1, 100)
self.ui.label.setText(number)
Теперь нужно создать сигнал. Если проще, "подключить" виджет к слоту.
self.ui.pushButton.clicked.connect(self.generate_number)
Готово. Мы написали код. Полное приложение:
import random
from PySide6.QtWidgets import QApplication, QMainWindow
from design import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.generate_number)
def generate_number(self):
number = random.randint(1, 100)
self.ui.label.setText(number)
def main():
app = QApplication()
window = MainWindow()
window.show()
app.exec()
if __name__ == "__main__":
main()
Теперь можем запускать проект. Всё работает!
Что делать если вы хотите изменить иконку, размер, название окна и ещё много чего? Расскажу самое главное.
Иконка:
from PySide6.QtGui import QIcon
self.setWindowIcon(QIcon('path/to/icon.png'))
* Так же мы можем изменить иконку всего приложения, в данном случае если иконка для окна не задана то будет иконка приложения по умолчанию
Размер:
self.resize(800, 600)
Название:
self.setWindowTitle("My Window")
Больше параметров вы найдёте в официальной документации Qt и Qt for Python.
Эти параметры можно использовать двумя способами. Первый способ вставить в класс окна (MainWindow). Второй способ заменить self на window и вставить в функцию main()
app.setStyle("Fusion")
Мы можем изменять стиль приложения, например Windows (старый стиль для совместимости), WindowsVista (Legacy стиль Windows Aero), современный Fusion и много чего. Некоторые стили зависят от платформы.
Больше информации про стили вы найдёте в официальной документации - https://doc.qt.io/qt-6/qstyle.html#details [8]
Мы создали приложение, написали код, настроили стиль. Все работает.
Мы можем создать новые окна, добавить другие слоты и сигналы и много чего. Что бы я ещё сделал? Наверное если приложение полезное, его можно упаковать в .exe файл а потом в установщик. Например используя связку pyinstaller + Inno Setup. Но это в следующий раз...
Автор: Andrey4ik
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/419585
Ссылки в тексте:
[1] https://www.python.org/downloads/: https://www.python.org/downloads/
[2] https://doc.qt.io/qtforpython-6/: https://doc.qt.io/qtforpython-6/
[3] https://doc.qt.io/: https://doc.qt.io/
[4] https://wiki.qt.io/Main: https://wiki.qt.io/Main
[5] shiboken6: https://doc.qt.io/qtforpython-6/shiboken6/index.html
[6] pyside6-project: https://doc.qt.io/qtforpython-6/tools/pyside-project.html
[7] https://build-system.fman.io/qt-designer-download: https://build-system.fman.io/qt-designer-download
[8] https://doc.qt.io/qt-6/qstyle.html#details: https://doc.qt.io/qt-6/qstyle.html#details
[9] Источник: https://habr.com/ru/articles/909118/?utm_source=habrahabr&utm_medium=rss&utm_campaign=909118
Нажмите здесь для печати.