Connecter l'event d'un bouton QML à une méthode C++

Avec l'arrivée du QML la partie graphique est bien isolée des classes c++, ce qui peut dérouter au début... Ici on ne verra pas le model à proprement parler mais seulement la connexion avec un objet c++ simple
cpp to Qml

Connecter un objet c++ à l'UI

Pour utiliser les méthodes d'une class c++ via QML QtQuick il faut passer l'objet via le root context.

Exemple avec une simple class hello 

class Hello: public QObject
{
Q_OBJECT
private:
	QString m_name;
public:
	Hello(const QString& name): m_name(name){}
	Q_INVOKABLE QString getName(){return m_name;}
};

Notez bien la macro Q_INVOKABLE devant la getName, qui permet de signifier au qml que c'est une méthode.

Puis dans le main on "instancie" l'objet hello, et on le passe via le context

QQmlApplicationEngine engine;
QQmlContext *ctx = engine.rootContext();

Hello person("Jeannot");
ctx->setContextProperty(QStringLiteral("person"), &person);

Ensuite avec le Qml il suffit d'appeler simplement la méthode via l'objet !

Button {
	id: button_s
	text: qsTr("Test connexion c++...")
	MessageDialog {
		id: messageDialog
		title: "Hey"
		text: "..."
		onAccepted: {
			console.log("MessageDialog OK.")
		}
	}
	onClicked: {
		messageDialog.text = qsTr( "Bonjour " + person.getName() )
		messageDialog.open();
	}
}
Qml messagebox c++

Afficher un objet type QString dans l'UI

De la même manière que ci-dessus, pour afficher un QString via QtQuick une méthode simple est de passer l'objet via le context

QQmlApplicationEngine engine;
QQmlContext *ctx = engine.rootContext();

QString Device_Name = QSysInfo::machineHostName() +" "+ QSysInfo::prettyProductName() +" "+ QSysInfo::productVersion() ;
ctx->setContextProperty(QStringLiteral("m_deviceName"), Device_Name);

Puis dans le Qml

Button {
	id: button_s
	text: qsTr("Test connexion c++...")
	MessageDialog {
		id: messageDialog
		title: "Hey"
		text: "..."
		onAccepted: {
			console.log("MessageDialog OK.")
		}
	}
	onClicked: {
		messageDialog.text = qsTr( m_deviceName )
		messageDialog.open();
	}
}

Write a comment

@

What is the first letter of the word kgeqnm? :