Писали ли вы графические интерфейсы на QML?

Ответ

Да, я разрабатывал пользовательские интерфейсы с использованием QML (Qt Modeling Language) в связке с C++. QML идеально подходит для создания современного, анимированного UI, в то время как C++ используется для сложной бизнес-логики, работы с данными и производительных операций.

Типичная архитектура проекта:

  1. QML-слой: Декларативное описание интерфейса, анимаций, состояний.
  2. C++-бэкенд: Предоставляет данные и логику, регистрируется в QML-контексте.

Пример интеграции C++ класса в QML:

C++ класс (DataProcessor.h):

#include <QObject>
#include <QString>

class DataProcessor : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString result READ result NOTIFY resultChanged) // Свойство для QML

public:
    explicit DataProcessor(QObject *parent = nullptr);
    QString result() const;

public slots:
    void calculate(const QString& input); // Слот, вызываемый из QML

signals:
    void resultChanged();

private:
    QString m_result;
};

QML-файл (Main.qml):

import QtQuick 2.15
import QtQuick.Controls 2.15
import com.myapp 1.0 // Импорт нашего C++ модуля

ApplicationWindow {
    visible: true
    width: 400
    height: 300

    DataProcessor { // Экземпляр C++ класса
        id: processor
        onResultChanged: resultText.text = result
    }

    Column {
        anchors.centerIn: parent
        spacing: 10

        TextField {
            id: inputField
            placeholderText: "Введите данные"
        }

        Button {
            text: "Обработать"
            onClicked: processor.calculate(inputField.text) // Вызов C++ слота
        }

        Text {
            id: resultText
            text: "Результат"
        }
    }
}

В работе использовал Qt Quick Controls 2, модели (ListModel, QAbstractItemModel), сложные привязки данных (property bindings) и анимации (NumberAnimation, SequentialAnimation).

Ответ 18+ 🔞

Да ты посмотри, какая красота! Я, блядь, как раз этим и занимался — лепил интерфейсы на QML, а всю тяжёлую логику пихал в C++. Это, ёпта, идеальный тандем: QML — это как художник, который рисует плавные анимации и красивые кнопки, а C++ — как бухгалтер в подвале, который там всё считает, с данными работает и вообще делает всю грязную работу. Овердохуища удобно, честно.

Как обычно это всё устроено, если по-простому:

  1. QML-слой: Тут ты просто описываешь, как всё должно выглядеть и двигаться. Почти как сказку пишешь.
  2. C++-бэкенд: А это уже серьёзный дядя, который регистрируется в системе и говорит: «Ребята из QML, все вопросы ко мне. Данные, расчёты — я всё тут».

Вот, смотри, как C++ класс в QML впендюрить. Проще пареной репы, если один раз понять.

C++ класс (DataProcessor.h): (Блок кода не трогаем, он святой)

#include <QObject>
#include <QString>

class DataProcessor : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString result READ result NOTIFY resultChanged) // Свойство для QML

public:
    explicit DataProcessor(QObject *parent = nullptr);
    QString result() const;

public slots:
    void calculate(const QString& input); // Слот, вызываемый из QML

signals:
    void resultChanged();

private:
    QString m_result;
};

QML-файл (Main.qml): (И тут не лезем, всё правильно)

import QtQuick 2.15
import QtQuick.Controls 2.15
import com.myapp 1.0 // Импорт нашего C++ модуля

ApplicationWindow {
    visible: true
    width: 400
    height: 300

    DataProcessor { // Экземпляр C++ класса
        id: processor
        onResultChanged: resultText.text = result
    }

    Column {
        anchors.centerIn: parent
        spacing: 10

        TextField {
            id: inputField
            placeholderText: "Введите данные"
        }

        Button {
            text: "Обработать"
            onClicked: processor.calculate(inputField.text) // Вызов C++ слота
        }

        Text {
            id: resultText
            text: "Результат"
        }
    }
}

А в работе, бля, чего только не было: и эти Qt Quick Controls 2, и модели всякие — хочешь простенькую ListModel, хочешь целую QAbstractItemModel из C++ тащи. Привязки данных такие, что голова кругом идёт, а анимации — NumberAnimation, SequentialAnimation — так вообще, ебать мои старые костыли, красота неописуемая. Главное — понять эту магию, а потом уже, чувак, можно творить что угодно. Волнение ебать, когда всё сходится и работает как часы.