janvier
2011
Un petit billet pour vous montrer comment changer le curseur de la souris lors du survole 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, je vous propose donc de le faire manuellement.
Résultat :
Bibliothèque C++ :
Je crée une classe de bibliothèque nommé Biblio.
Dans cette classe, je crée une méthode AfficheCurseur qui récupère le nom du curseur et qui affiche le curseur correspondant.
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 <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);
}
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, je crée mon objet Biblio.
QDeclarativeView *ui;
Biblio biblio;
Dans le fichier MainWindow.cpp j’ajoute la référence de mon 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);
Création du composant Bouton :
Je m’appuie sur les boutons de l’exemple fourni dans Qt sdk 4.7 disponible à cette adresse
Je crée un fichier QML nommé Bouton.qml.
Dans ce bouton, je crée une surface de capture d’événement de la souris MouseArea. Sur cette surface, je me 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 clique de la souris.
Sur ces signaux, j’appelle la fonction AfficheCurseur de mon objet Biblio.
Ce qui donne :
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 }
}
}
Commentaires récents
- Mono for Android dans
- Mono for Android dans
- [Mono]Asynchrone Mon meilleur ennemi dans