QML et le changement du curseur

| Guillaume Fortin | Aktaour |

Un petit tutoriel pour montrer comment changer le curseur de la souris lors du survol d'un bouton dans une application Qt mixte C++/QML.

Il n'existe apparemment pas de fonction QML pour changer le curseur de l'application, on le fera donc manuellement.

Commentez !

- Titre : QML et le changement du curseur

- Auteurs : Guillaume Fortin, Aktaour

- Parution : 6 mars 2011

- Mise à jour : 17 avril 2011

- Licence : Copyright ® 2011 Guillaume Fortin. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Résultat

- II. Bibliothèque C++

- III. Connexion C++ vers QML

- IV. Création du composant Bouton

- V. Remerciements

I - Résultat

II - Bibliothèque C++

On crée une classe nommée Biblio. Dans cette classe, on crée une méthode AfficheCurseur qui récupère le nom du curseur et qui affiche le curseur correspondant.

biblio.h

#ifndef BIBLIO_H
#define BIBLIO_H
#include <QObject>
#include <qdeclarative.h>

class Biblio : public QObject
{
Q_OBJECT
public:
explicit Biblio(QObject *parent = 0);
Q_INVOKABLE void AfficheCurseur(QString);
signals:
public slots:

};
#endif // BIBLIO_H

biblio.cpp

#include "biblio.h"
#include <QtGui/QApplication>
#include <QCursor>

Biblio::Biblio(QObject *parent) :
QObject(parent)
{
}
void Biblio::AfficheCurseur(QString typeCurseur)
{
QCursor curseur;
if(typeCurseur.toUpper() == "HAND")
curseur = QCursor(Qt::PointingHandCursor);
else
curseur = QCursor(Qt::ArrowCursor);
QApplication::setOverrideCursor(curseur);
}

III - Connexion C++ vers QML

Pour rendre accessible la méthode AfficheCurseur en QML, il faut référencer un objet Biblio dans l'objet QDeclarativeView.

Dans le fichier MainWindow.h, on crée un objet Biblio.

private:
QDeclarativeView *ui;
Biblio biblio;

Dans le fichier MainWindow.cpp, on ajoute la référence de l'objet Biblio sur le contexte du QDeclarativeView. Dans mon code QML, il sera appelable par le nom donné dans la méthode setContextProperty.

ui->rootContext()->setContextProperty("Biblio", &biblio);

IV - Création du composant Bouton

On s'appuie sur les boutons de l'exemple fourni dans le Qt SDK.

On crée un fichier QML nommé Bouton.qml. Dans ce bouton, on crée une surface de capture d'événement de la souris MouseArea. Sur cette surface, on se connecte au signal onEntered et onExited qui respectivement capture l'entrée et la sortie du la souris sur la surface d'exposition. Attention, la propriété hoverEnabled doit être active, sinon l'événement est appelé uniquement lors du clic de la souris.

Sur ces signaux, on appelle la fonction AfficheCurseur de l'objet Biblio.

import Qt 4.7
BorderImage {
id: button
property alias text: buttonText.text
property alias font: buttonText.font
property string color: ""
property string hint: ""
property int bordure: 8;
property int tag: 0;
signal boutonClick(int idBouton)
source: "images/button-" + color + ".png"; clip: true
border { left: 10; top: 10; right: 10; bottom: 10 }
width: buttonText.width + bordure*2;

Rectangle {
id: shade
anchors.fill: button; radius: 10; color: "black"; opacity: 0
}
Text {
id: buttonText
anchors.centerIn: parent; anchors.verticalCenterOffset: -1
font.pixelSize: 20;
style: Text.Sunken; color: "white"; styleColor: "black"; smooth: true
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onClicked: {
button.boutonClick(button.tag)
}
onEntered: {
Biblio.AfficheCurseur("hand")
}
onExited: {
Biblio.AfficheCurseur("none")
}
}
states: State {
name: "pressed"; when: mouseArea.pressed == true
PropertyChanges { target: shade; opacity: .4 }
}
}

V - Remerciements

Merci à dourouc05 et à eusebe19 pour leur relecture !