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