Barra laterale

programmazione:qt:eseguire_funzioni_c_da_qml

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" ;
}

programmazione/qt/eseguire_funzioni_c_da_qml.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)