PyQt5 QML#
PyQt5 и QML — это мощное сочетание для создания современных, динамичных и красивых пользовательских интерфейсов. QML (Qt Modeling Language) — это декларативный язык, основанный на JavaScript, который позволяет легко описывать интерфейсы и их поведение. В сочетании с PyQt5 вы можете использовать всю мощь Python для backend-логики и QML для frontend-интерфейса.
Основные пакеты
Пакет |
Версия |
Репозиторий |
Описание |
---|---|---|---|
python3-pqt5 |
5.15.9+dfsg-1+b1 |
installation |
Библиотека PyQt5 |
python3-pyqt5.qtquick |
5.15.9+dfsg-1+b1 |
extended |
Библиотека QtQuick |
Установка PyQt5 и PyQt5.QtQml#
для работы с QML в PyQt5 вам понадобится установить пакет PyQt5 и модуль PyQt5.QtQml, убедитесь, что у вас установлены следующие зависимости:
sudo apt install python3-pyqt5 python3-pyqt5.qtquick
Структура проекта#
пример структуры проекта:
project/
│
├── main.py # Основной файл приложения на Python
├── main.qml # QML-файл с описанием интерфейса
└── resources/ # Папка для дополнительных ресурсов (например, изображений)
Пример: Простое приложение с QML и PyQt5#
файл main.qml (QML-интерфейс):
import QtQuick 2.15
import QtQuick.Controls 2.15
ApplicationWindow {
visible: true
width: 400
height: 300
title: "PyQt5 + QML Example"
// Текстовое поле
Text {
id: label
text: "Hello, QML!"
anchors.centerIn: parent
font.pixelSize: 24
}
// Кнопка
Button {
text: "Отправить"
onClicked: handler.print_message("Привет из QML!")
}
}
файл main.py (Python-логика):
import sys
from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
# Класс для взаимодействия между Python и QML
class PythonHandler(QObject):
# Сигнал для обновления текста в QML
updateText = pyqtSignal(str, arguments=['text'])
def __init__(self):
super().__init__()
# Слот, который будет вызываться из QML
@pyqtSlot(str)
def print_message(self, msg):
print(f"Получено из QML: {msg}")
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
# Создаём движок QML
engine = QQmlApplicationEngine()
# Создаём экземпляр PythonHandler
handler = PythonHandler()
# Регистрируем PythonHandler в QML
engine.rootContext().setContextProperty("handler", handler)
# Загружаем QML-файл
engine.load(QUrl.fromLocalFile("main.qml"))
if not engine.rootObjects():
sys.exit(-1)
# Подключаем сигнал к слоту для обновления текста
sys.exit(app.exec_())
Объяснение кода#
Пункт 1#
QML-часть (main.qml)
ApplicationWindow: Основное окно приложения.
Text: Текстовый элемент, который отображает сообщение.
Button: Кнопка, которая вызывает метод Python при нажатии.
Пункт 2#
Python-часть (main.py)
PythonHandler: Класс, который служит мостом между Python и QML.
updateText: Сигнал, который отправляет текст в QML.
onButtonClicked: Слот, который вызывается из QML.
QQmlApplicationEngine: Движок для загрузки и выполнения QML-кода.
Регистрация handler: Мы регистрируем экземпляр handler в QML с помощью setContextProperty.
Загрузка QML: Загружаем QML-файл с помощью engine.load.
Запуск приложения#
Убедитесь, что у вас установлен PyQt5.
Сохраните main.qml и main.py в одной папке.
Запустите приложение:
python main.py