I. Résultat

Image non disponible

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
Sélectionnez
#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
Sélectionnez
#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.

 
Sélectionnez
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.

 
Sélectionnez
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.

 
Sélectionnez
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 !