Projet

Général

Profil

AbulEduMessageBoxV1

La classe AbulEduMessageBoxV1 est une dérivation de QMessageBox. On y trouve par défaut une tête d'Asma "étonnée" dans un coin. C'est une fenêtre de type "splashscreen". Elle n'hérite pas de QMessageBox ou QDialog, et ce au prix de la perte des méthodes accept() et reject() qui nous auraient bien servi, mais parce que ces classes même avec parent restent toujours des pop-up dont il est impossible de masquer l'habillage "système".

Installation

L'installation de la classe AbulEduMessageBoxV1 se fait dans le dossier lib de votre logiciel, par exemple

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

Mainteneur de la lib:

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

Modification du fichier.pro

Pensez à modifier votre fichier .pro pour ajouter cette nouvelle lib

#AbulEduMessageBoxV1
include(lib/abuledumessageboxv1/abuledumessageboxv1.pri)

Utilisation

Au lieu d'appeler un

QMessageBox* message = new QMessageBox(type de messageBox, titre, texte, éventuellement parent)

il suffit d'appeler un
AbulEduMessageBoxV1* message = new AbulEduMessageBoxV1(titre,texte, booléen,éventuellement parent)
message->show();

Le booléen indique si la fenêtre doit être fermée quand on clique sur un des boutons. La valeur false fera qu'elle ne sera pas fermée mais seulement cachée.
Même si le parent n'est pas obligatoire il est fortement conseillé...

On peut mettre une tête d'Asma qui fait un clin d'oeil plutôt, pour l'aide par exemple, et appelant la fonction

message->setWink();

Il est par ailleurs possible que vous ayez une bordure noire tout autour...
- cas n°1 : vous n'avez pas passé de parent à votre AbulEduMessageBoxV1 donc à vous de voir si c'est gênant de le faire
- cas n°2 : c'est (comme sur mon poste, par exemple) un réglage du gestionnaire de fenêtre... moi, c'est "Aucun" qui est coché dans Système/Préférences/Apparence/Effets visuels donc à vous de voir encore !!

Si vous souhaitez forcer dans le texte un retour à la ligne, ajoutez la balise html <br /> à l'endroit souhaité.

Améliorations

Ajout de modes multiboutons

à l'origine, l'AbulEduMessageBoxV1 n'avait qu'un bouton Fermer, qu'on pouvait décider de montrer ou pas (comme dans le slotDemo, par exemple) grâce à une méthode hideCloseButton(). C'était nettement insuffisant pour couvrir le champs d'application des QMessageBox. On leur a donc ajouté deux boutons, OK et Annuler, et on décide des boutons affichés par la méthode

void abeSetModeEnum(enumAbulEduMessageBoxMode mode);

Le mode est choisi parmi abeNoButton (aucun bouton affiché), abeCloseButton (bouton Fermer, comportement par défaut), abeAcceptCancelButton (un bouton Annuler et un bouton OK) et abeAcceptCancelCloseButton (les trois boutons présents). Chaque bouton émet un signal propre quand il est cliqué.
Par exemple, par avoir une fenêtre qui demande confirmation pour quitter si un changement est détecté, j'ai fait comme ceci :
void machin::closeEvent(QCloseEvent *e)
{
    if(m_localDebug) {
        qDebug()  << __FILE__ <<  __LINE__ << __FUNCTION__;
    }

    if(!isWindowModified()){
        e->accept();
        return;
    }
    else
    {
        e->ignore();
        m_isCloseRequested = true;
        AbulEduMessageBoxV1* mb = new AbulEduMessageBoxV1(trUtf8("Classe machin"),trUtf8("Fermeture du programme.\nVoulez-vous sauvegarder?"));
        mb->abeSetModeEnum(AbulEduMessageBoxV1::abeAcceptCancelCloseButton);
        mb->show();
        connect(mb,SIGNAL(signalAbeMessageBoxOK()),SLOT(on_actionSaveProject_triggered()));
        connect(mb,SIGNAL(signalAbeMessageBoxCloseOrHide()),SLOT(slotForceClose()));
    }
}

Le slotForceClose() détruit l'AbulEduMessageBoxV1 puis l'instance de machin en cours.
Le slot qui est connecté au signal signalAbeFileSaved de l'AbulEduBoxFileManager contient un AbulEduMessageBoxV1 qui informe de l'état d'enregistrement, et le booléen m_isCloseRequested permet connecter (ou pas) le signalAbeMessageBoxCloseOrHide() de ce deuxième AbulEduMessageBoxV1 au slotForceClose(). Ainsi, si j'ai mis mon booléen à true dans closeEvent, le clic sur le bouton Fermer du deuxième AbulEduMessageBox provoque la fermeture de l'appli...
Une détection du KeyRelease transforme l'appui sur les touches Entrée ou Return en clic sur OK s'il est visible, sinon sur Fermer s'il est visible, et l'appui sur la touche Echap en clic sur le bouton Annuler s'il est visible.

Redmine Appliance - Powered by TurnKey Linux