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 :
- 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
- La ScrollArea avec ici un ascenseur
- La AbulEduLabelFrameV1 qui accueille les AbulEduLabels et gère leur placement.
- 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();