Projet

Général

Profil

AbulEduLabelV1

Cette classe introduit un Widget composé de trois niveaux :
  • AbulEduLabelWidgetV1 qui est une QFrame accueillant une QScrollArea et quatre AbulEduFlatBoutonV1 de direction pour manipuler les étiquettes
  • AbulEduLabelFrameV1 qui est une QFrame insérée dans une QScrollArea. Elle reçoit les étiquettes à manipuler.
  • AbulEduLabelV1 : c'est la classe des étiquettes qui sont des QLabels. Elles sont disponibles et manipulables sur la AbulEduLabelFrameV1

Cet AbulEduWidget a pour objet de manipuler des listes de mots, phrases, images pour les ordonner, les mettre en correspondance.

Vous trouverez tout en bas de la page un lien pour télécharger les sources d'une petite application de démo.

Installation

L'installation des classes AbulEduLabelV1 se fait dans le dossier lib de votre logiciel.

Soit en utilisant les branches externes en lecture seule :

git submodule add http://redmine.abuledu.org/ryxeo/leterrier-developpeurs/abuledulabelv1.git src/lib/abuledulabelv1

Mainteneur de la lib:

git clone ssh://gitolite3@redmine.abuledu.org/repositories-redmine/ryxeo/leterrier-developpeurs/abuledulabelv1.git

Modification du fichier .pro¶

#AbulEduLabelV1
include(lib/abuledulabelv1/abuledulabelv1.pri)

Dépendances

Il est nécessaire d'installer aussi la classe AbulEduFlatBoutonV1

Utilisation

Conçu pour faciliter le développement des logiciels du Terrier, ce widget peut être utilisé par la promotion d'un autre QWidget typiquement une QFrame. Ceci permet de concevoir son interface avec le designer de QtCreator. Une fois le widget promu, toute sa structure est en place. Il ne reste qu'à l'utiliser.

À ce sujet voir la doc sur la promotion

Installation de la AbulEduLabelFrameV1

Cette classe est le cœur du widget. On ne devrait pas avoir à utiliser AbulEduLabelWidgetV1 et AbulEduLabelV1 directement, sauf peut-être pour des modifications cosmétiques.
Nous supposerons par la suite que notre AbulEduLabelWidgetV1 se trouve ici (par promotion) ui->labelZone

    aireDeJeu = new AbulEduLabelFrameV1(Qt::Horizontal, ui->labelZone);
    aireDeJeu->setFrameShape(QFrame::Box);
    aireDeJeu->setStyleSheet("background-color: rgb(255, 255, 127);");
    ui->labelZone->labelsScrollArea->setWidget(aireDeJeu);
    aireDeJeu->show();

À la ligne 1 on crée notreAbulEduLabelFrameV1 avec notre AbulEduLabelWidget comme parent (important !)
aireDeJeu est notre nouvelle AbulEduLabelFrame, comme elle hérite de QFrame, on peut utiliser les fonctions de QFrame pour la personnaliser (ligne 2 et 3)
Ensuite, il faut ajouter cette aireDejeu dans la ScrollArea nommée labelsScrollArea (ligne 4).
Et enfin, on la montre si c'est bien le moment !

Création des AbulEduLabels

Les AbulEduLabelV1 sont des Qlabels modifiés pour gérer le Drag and Drop dans une liste organisée verticalement ou horizontalement. Étant des Qlabels, ils héritent de leurs fonctions membres.
Pour créer une liste, nous allons passer à la fonction de création une QStringList nommée ici listeMots. Dans le cas d'activités de remise en ordre, il est préférable de construire la QStringList dans l'ordre correct.

    aireDeJeu->abelabelSetLargeurEtiquettes(200);
    aireDeJeu->abelabelCreeAbulEduLabels(listeMots);
    aireDeJeu->abelabelMontreEtiquettes(true);
    aireDeJeu->abelabelMelangeAbulEduLabels();

À la ligne 1, on fixe la largeur des étiquettes, soit en dur comme ici, soit en la calculant en fonction de vos besoins.
Ligne 2, on crée les étiquettes en passant le paramètre listeMots.
La ligne 3, permet de montrer les étiquettes (ou pas en passant false comme paramètre)
La dernière ligne permet de mélanger les étiquettes et ainsi de proposer une liste en désordre.

En résumé

Nous voyons sur la capture ci-dessus les différentes zones de notre widget :
  1. Le widget lui-même AbulEduLabelWidget avec les AbulEduFlatBoutons haut et bas ici désactivés car il n'y a pas d'étiquettes sélectionnées
  2. La ScrollArea avec ici un ascenseur
  3. La AbulEduLabelFrameV1 qui accueille les AbulEduLabels et gère leur placement.
  4. Les AbulEduLabels

Les fonctions utiles (j'espère)

En préambule, je tiens à dire que j'ai essayé de documenter les fonctions dans le .h des classes. Si vous êtes curieux, ne vous gênez pas !

Pour commencer, dans votre mainwindow, il peut être utile de récupérer un pointeur sur l'AbulEduLabelFrameV1 afin d'accéder à ses fonctions. Voici une manière de faire :

    AbulEduLabelFrameV1 *aire = ui->labelZone->findChild<AbulEduLabelFrameV1 *>();

Dans AbulEduLabelWidget

Là, il n'y a rien d'intéressant : cette classe ne fait qu'instancier les différents objets et implémenter les signaux des boutons.

Dans AbulEduLabelFrameV1

explicit AbulEduLabelFrameV1(int orientation = Qt::Vertical, QWidget *parent = 0);

Constructeur de la classe : on précise l'orientation de la liste Qt::Horizontal (defaut) ou Qt::Vertical. Bien que facultatif, il faut passer la AbulEduLabelWidget comme parent.
    void abelabelCreeAbulEduLabels(QStringList listeTextes);

Cette fonction crée les AbulEduLabels et les positionne dans la AbulEduFrameV1
Un certain nombre de fonctions permettent de modifier l'apparence de la liste :
    void abelabelSetPosListeLabels(QPoint position); //Fixe la position de départ de la première étiquette.
    void abelabelSetPosListeLabels(int x, int y);
    void abelabelSetMarge(int marge); // l'espace entre les étiquettes
    void abelabelSetLargeurEtiquettes(int largeur);
Des fonctions permettent de récupérer différentes listes :
Les étiquettes embarquent des attributs supplémentaires par rapport à des QLabels :
  • numOrdre : la place de l'étiquette dans l'ordre logique, généralement l'ordre dans lequel elles ont été créées.
  • numPlace : le rang de l'étiquette dans AbulEduLabelFrameV1
  • lastPos : la position de l'étiquette avant son déplacement (à manipuler avec précaution)
      QMap<int, AbuleduLabelV1 *>abelabelListeAbuleduLabelsByNumPlace(); // QMap avec pour clé le numPlace et pour valeur un pointeur sur l'étiquette
      QMap<int, AbuleduLabelV1 *>abelabelListeAbuleduLabelsByNumOrdre(); // QMap avec pour clé le numOrdre et pour valeur un pointeur sur l'étiquette
      void abelabelMelangeAbulEduLabels(); // Mélange la liste des étiquettes en changeant leur numPlace

On peut aussi montrer ou cacher les étiquettes, les déselectionner en bloc, les afficher dans leur de leur numOrdre ou numPlace :

    void abelabelDeselectionneLabels(); // désélectionne les étiquettes éventuellement sélectionnées
    void abelabelMontreEtiquettes(bool onOff); // Montre ou cache les étiquettes
    void abelabelPlaceAbulEduLabelsByNumPlace(); // Affiche les étiquettes dans l'ordre de leur numPlace
    void abelabelPlaceAbulEduLabelsByNumOrdre(); // Affiche les étiquettes dans l'ordre de leur numOrdre

Les AbulEduLabels

Voici la doc brute des fonctions publiques

    /** Attribue un numéro d'ordre de classement à l'étiquette
      * i.e. ordre alphabétique
      * @param intOrdre le numéro d'ordre
      */
    void abelabelSetNumOrdre(int intOrdre);

    /** Retourne le numéro d'ordre de classement de l'étiquette
      * i.e. ordre alphabétique
      * @return le numéro d'ordre -1 par défaut
      */
    int abelabelNumOrdre();

    /** Attribue un rang physique à l'étiquette
      * @param intPlace le numéro d'ordre
      */
    void abelabelSetNumPlace(int intPlace);

    /** Retourne le rang physique de l'étiquette
      * @return le numéro d'ordre -1 par défaut
      */
    int abelabelNumPlace();

    /** Stocke la position de l'étiquette après son déplacement
      * @param lastPoint la position a mémoriser
      */
    void abelabelSetLastPos(QPoint abelabelLastPos);

    /** Fonction surchargée
      * @param x,y abscisse et ordonnée de la position à mémoriser
      */
    void abelabelSetLastPos(int x,int y);

    /** Retourne la position mémorisée
      * @return lastPoint la position mémorisée
      */
    QPoint abelabelLastPos();

    /** Fixe l'espace entre deux étiquettes 10 par défaut
      * @param marge
      */
    void abelabelSetMarge(int abelabelMarge);

    /** Retourne l'espace entre deux étiquettes
      * @return
      */
    int abelabelMarge();

Sélection_026.png (13,4 ko) Jean-Louis Frucot, 24/08/2011 09:24

abuledulabelv1.tar.gz - Une petite appli de démonstration (30 ko) Jean-Louis Frucot, 24/08/2011 10:27

Redmine Appliance - Powered by TurnKey Linux