Projet

Général

Profil

AbulEduEtiquettesV1

Cette librairie introduit quatre classes permettant la gestion du Drag&Drop d'étiquettes (texte et/ou image).

Installation

L'installation des classes AbulEduEtiquettesV1 se fait dans le dossier lib de votre logiciel, par exemple

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

Mainteneur de la lib:

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

Utilisation

  • Modification du fichier .pro de votre projet
#AbulEduEtiquettesV1
include(lib/abuleduetiquettesv1/abuleduetiquettesv1.pri)

AbulEduEtiquettesV1 fournit un certain nombre de classes permettant de créer un widget de type QGraphicsView sur lequel on peut déposer des Pièces mobiles et des Cellules fixes sur lesquelles on peut déposer les pièces. Une classe permet aussi de créer des tableaux de Cellules avec entêtes...

  • AbulEduEtiquettesV1 le widget gérant les Pièces et les Cellules
  • AbulEduSceneEtiquettesV1 la QGraphicScene intégrée à la classe ci-dessus
  • AbulEdupieceV1 la classe des étiquettes
  • AbulEduCelluleV1 la classe des ... cellules
  • AbulEduTableauV1 la classe permettant de créer des tableaux

Création de l'"aire de jeu"

   gv_AireDeJeu = new AbulEduEtiquettesV1(QPointF(0,0));

Cette aire de jeu pourra être intégrée à un autre widget tel qu'une QFrame,

gv_AireDeJeu->setParentWidget(Ma_Frame);

ou une QGraphicsView en utilisant un QGraphicsProxyWidget

    QGraphicsProxyWidget *proxy = Ma_GraphicView->scene()->addWidget(gv_AireDeJeu)

Création des Pièces

Les pièces sont composées d'un contour, d'un fond, d'une image(ou pas), d'un texte (ou pas) et sont déplaçables à la souris. Elles sont limitées dans leur déplacement à la scène de la QGraphicsView qui les accueille.

Voici un exemple de création d'étiquette

    AbulEduPieceV1 *etiq = new AbulEduPieceV1(QSize(maxLargeurEtiquette, hauteurEtiquette));
    etiq->abePieceSetFont(QFont("LiberationSans",14));
    etiq->abePieceSetTexte(m_listeMots[i]); // Le texte visible de l'étiquette
    etiq->setObjectName(QString::number(i));
    etiq->setBrush(gradient);  // La brosse de fond de l'étiquette
    etiq->abePieceSetMarge(5);
    etiq->abePiecePlaceFixe(false);
    etiq->abePieceSetTexteAlignement(Qt::AlignCenter);
    etiq->setParent(gv_AireDeJeu->scene());
    gv_AireDeJeu->scene()->addItem(etiq);

Il est nécessaire de ne pas oublier les deux dernière lignes : la pièce doit être parentée à la scene sous-jacente, et il ne faut pas oublier d'ajouter la pièce à la scène (Oui, il faut les deux ! )

Lorsqu'une pièce est déposée sur une cellule, celle-ci émet le signal ci-dessous qui retourne le nom de la pièce déposée et le numéro de la cellule :

abePieceDeposee(QString nom, int numCellule)

Les pièces disposent de nombreuses fonctions permettant de gérer leur contour, leur fond, les images et le texte. Pour cela il faut consulter leur .h :P
Suite des problèmes de calage du texte, j'ai ajouté une fonction qui permet d'interdire le retour à la ligne dans la cellule. Il faut faire

piece->abePieceSetAcceptWordWrap(false);

Comme l'implémentation initiale permettait les retours à la ligne, le comportement par défaut est celui-là.

Création des Cellules

Les cellules sont des zones destinées à accueillir des Pièces (ou pas). Elles peuvent elles aussi, contenir du texte et des images.

    AbulEduCelluleV1(QSizeF(maxLargeurEtiquette + 10, hauteurEtiquette +10));
    zone->setObjectName(QString::number(i));
    zone->setParent(gv_AireDeJeu->scene());
    gv_AireDeJeu->scene()->addItem(zone);

Il est important de donner un numéro aux cellules (ligne 2)
Comme pour les Pièces, ils ne faut pas oublier les deux dernières lignes !

Plus de renseignements dans le .h de la classe !

Création d'un tableau

Un tableau est un ensemble de Cellules "bien rangées". Il comprend des cellules d'entête, de coin et centrales. Les cellules centrales sont numérotées de 0 à nbLigne*nbcolonnes - 1

Un tableau se construit de la façon suivante :

AbulEduTableauV1(QWidget *parent, int nbColonnes, int nbLignes, Entetes flagsEntete = 0);

Le Parent peut (doit) avantageusement être une AbulEduEtiquettesV1.
Le nombre de lignes et de colonnes correspond aux lignes et colonnes centrales sur lesquelles on peut déposer des AbulEduPieceV1. Le flag Entete correspond à une combinaison de Flags séparés par "|" dont voici la liste
 Haut, Bas, Gauche, Droit, HautGauche, HautDroit, BasDroit, BasGauche

Soit un exemple :


    int nbColonnes = 4;
    int nbLignes = 3;
    AbulEduTableauV1 *m_tableau = new AbulEduTableauV1( m_gvTableau, nbColonnes, nbLignes,
                                                        AbulEduTableauV1::Haut |
                                                        AbulEduTableauV1::Gauche |
                                                        AbulEduTableauV1::HautGauche);

Ce code construit un tableau de 4 colonnes et 3 lignes avec les entêtes en haut, à gauche et au coin HautGauche.

Les cellules composant le tableau sont accessibles par des pointeurs retournés par les fonctions suivantes :

 /** Retourne la ligne d'entete sélectionnée */
    QMap<int, AbulEduCelluleV1 *> abeTableauGetEntetes(Entete position);

/** Retourne un pointeur vers une cellule de coin */
    AbulEduCelluleV1 * abeTableauGetEnteteCoin(Entete position);

/** Retourne la liste des cellules "centrales" */
    QMap<int, AbulEduCelluleV1 *> abeTableauGetCellules();

/** Retourne un ponteur vers la cellule choisie */
    AbulEduCelluleV1 * abeTableauGetCellule(int numero);

Les cases du tableaux étant des Cellules, toutes les fonctions des cellules leur sont applicables.

Les lignes et colonnes sont redimensionnables avec les fonctions suivantes

    /** Redimensionne la colonne choisie
      * Le numérotage commence à 0 avec la colonne d'entete de gauche
      * et se termine à nombre de colonne +1 avec la colonne d'entete de droite
      */
    void abeTableauColonneRedim(int colonne, qreal taille);

 /** Redimensionne la ligne choisie
      * Le numérotage commence à 0 avec la ligne d'entete du haut
      * et se termine à nombre de lignes +1 avec la ligne d'entete du  bas
      */
    void abeTableauLigneRedim(int ligne, qreal taille);

    /** Redimensionne toutes les cellules d'un tableau y compris les entetes
      * @param taille la nouvelle teille des cellules (width, height)
      */
    void abeTableauRedimensionne(QSizeF taille);

Redmine Appliance - Powered by TurnKey Linux