Это укороченный вариант статьи http://blog.harrix.org/?p=5076. Там рассматривается конкретный пример работающего приложения, а здесь расписывается без воды, как добавить C++ часть в приложение Qt Quick.
В статье http://blog.harrix.org/?p=5082 рассказывается о подобном приложении, но с использованием компонентов QtQuick Controls.
В качестве среды для разработки используется Qt 5.6.0 для Windows 64-bit под компилятор Visual Studio 2015.
- Создайте приложение QtQuick Application.
- Создадим новый класс. Правой кнопкой щелкнем по проекту и выбираем пункт Add New....
- Там выбираем C++ Class.
- Далее вводим название нашего нового класса, например, HandlerSignals, а в качестве базового класса выбираем QObject.
- Заголовочный файл handlersignals.h меняем на следующий, где cppSlot — наш код, что будет исполняться из QML:
- Файл класса handlersignals.cpp меняем на такой:
- Перейдем к файлу main.cpp и меняем его на такой:
- В корневом элементе в qml файле прописываем сигнал. Например, такой:
- Теперь находите в нужном qml объекте можем отправить этот сигнал:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#ifndef HANDLERSIGNALS_H #define HANDLERSIGNALS_H #include <QObject> #include <QVariant> class HandlerSignals : public QObject { Q_OBJECT public: explicit HandlerSignals(QObject *parent = 0); signals: public slots: void cppSlot(const QString &msg); }; #endif // HANDLERSIGNALS_H |
1 2 3 4 5 6 7 8 9 10 |
#include "handlersignals.h" HandlerSignals::HandlerSignals(QObject *parent) : QObject(parent) { } void HandlerSignals::cppSlot(const QString &msg) { //Здесь располагается код С++, который вызывается QML элементом. } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <QGuiApplication> #include <QQmlApplicationEngine> #include "handlersignals.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); QObject* root = engine.rootObjects()[0]; HandlerSignals *handlerSignals= new HandlerSignals(root); QObject::connect(root, SIGNAL(qmlSignal(QString)), handlerSignals, SLOT(cppSlot(QString))); return app.exec(); } |
1 |
signal qmlSignal(string msg) |
1 2 3 4 5 6 7 |
//Действие мыши MouseArea { id: mouseArea1 anchors.fill: parent hoverEnabled: true; onClicked: {qmlSignal("яблок")} } |
Всё!