Eseguire funzioni (metodi) C++ dal codice Qml
Autore: Fabio Di Matteo
Ultima revisione: 01/12/2017 - 10:09
In questo breve esempio andremo a vedere come eseguire metodi c++ dal codice Qml. Nell'esempio che segue andremo a visualizzare un messaggio in console al click di un button.
La tecnica usata consiste nel creare una classe derivata da QObject (di nome pobtype) e in seguito esporla al qml tramite l'oggetto “engine” puntatore all'app qml. Ho creato la classe pobtype con l'autocomposizione di qtcreator , da aggiungi nuovo classe c++, specificando che deriva da QObject.
Alla fine tutto quello che dovremo fare è richiamare il nostro metodo della classe direttamente da qml:
//Questo metodo è nel codice C++ mypob.test()
Di seguito il codice completo e commentato nelle parti salienti:
main.qml
import QtQuick 2.6 import QtQuick.Window 2.2 import QtQuick.Controls 2.2 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") MouseArea { anchors.fill: parent Button { id: button0 x: 353 y: 94 text: qsTr("Button") onClicked: { //Questo metodo è nel codice C++ mypob.test() } } } }
main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine> #include "pobtype.h" //la mia classe #include <QQmlContext> //header necessari int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); //L'oggetto "mypob" sara' cosi' visibile dal qml col nome di "mypob" QScopedPointer<pobType>mypob (new pobType); engine.rootContext()->setContextProperty("mypob",mypob.data()); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }
pobtype.h
#ifndef POBTYPE_H #define POBTYPE_H #include <QObject> class pobType : public QObject { Q_OBJECT public: explicit pobType(QObject *parent = nullptr); Q_INVOKABLE void test(); signals: public slots: }; #endif // POBTYPE_H
pobtype.cpp
#include "pobtype.h" #include <QDebug> pobType::pobType(QObject *parent) : QObject(parent) { } Q_INVOKABLE void pobType::test() { qDebug()<<"Cliccato! \n" ; }