IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Utiliser QScintilla

Dans ce tutoriel nous allons apprendre à colorier syntaxiquement les textes dans Qt.
Vos questions et remarques sur le forum 4 commentaires

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Image non disponible
Image non disponible

QScintilla de Riverbank est une bibliothèque complémentaire de Qt permettant la coloration syntaxique du texte, mais aussi beaucoup d'autres choses comme :

  • la marge ;
  • la complétion de code ;
  • les indicateurs d'erreur dans la marge ;
  • les indicateurs de chaine non fermée ;

Et beaucoup d'autres choses !

QScintilla est sous la même licence que Qt (GNU GPL v2, v3 et sous licence Commercial).

II. Installer QScintilla

Pour ceux qui sont sous Linux, vous pouvez télécharger le paquet : libqscintilla2-dev.
Pour les autres téléchargez-le ici :
http://www.riverbankcomputing.com/software/qscintilla/download, puis décompressez l'archive.

S'il y a un problème, j'ai hébergé les fichiers compressés de QScintilla sur mon serveur FTP :

QScintilla peut s'installer en bibliothèque dynamique ou en bibliothèque statique.

Installation en bibliothèque dynamique :

  • Ouvrez la console Qt et déplacez-vous dans le dossier Qt 4 de QScintilla-gpl-2.3.2, puis lancez :
  • qmake ;
  • make ;
  • make install ;
  • ou qmake & make & make install (mais seulement sur Windows).

Les bibliothèques seront dans le dossier debug (ou release).

Installation en bibliothèque statique :

  • ouvrez le dossier Qscintilla-gpl-2.3.2 ;
  • puis ouvrez le dossier Qt4 ;
  • ouvrez le fichier qscintilla.pro :

    • faites une recherche de CONFIG += qt warn_off release dll thread,
    • changez dll par staticlib,
    • faites une autre recherche de DEFINES = QSCINTILLA_MAKE_DLL QT SCI_LEXER,
    • supprimez QSCINTILLA_MAKE_DLL,
    • ou alors, téléchargez et utilisez le fichier que j'ai préconfiguré : qscintilla.pro ;
  • ouvrez une console Qt ;
  • déplacez-vous dans le dossier Qt4 de Qscintilla-gpl-2.3.2 ;
  • faites :

    • qmake,
    • make,
    • make install ;
    • ou alors : qmake & make & make install (mais seulement sur Windows).

Si vous avez une erreur semblable à celle-ci :

Image non disponible
Erreur

Réinstallez Qt (tout compris même QScintilla si vous l'aviez auparavant) puis réinstallez-le. Et quand vous faites make install, il devrait y avoir des erreurs : ignorez-les, c'est tout à fait normal, ne vous en faites pas.

III. Utiliser QScintilla

La documentation de QScintilla se trouve ici : http://www.riverbankcomputing.com/static/Docs/QScintilla2/annotated.html
Avec les bibliothèques dynamiques, ajoutez-les dans le dossier debug (ou release).
Il faut aussi les linker : dans le .pro ajouter au-dessus de # Input :

  • LIBS += -lqscintilla2

On utilise la classe QsciScintilla(QWidget *parent=0) contenue dans #include <Qsci/qsciscintilla.h> pour créer une zone de texte.
Ce qui nous donne :

 
Sélectionnez
            #include <QApplication>
            #include <Qsci/qsciscintilla.h>
            
            int main(int argc, char* argv[])
            {
                QApplication app(argc, argv);
                QsciScintilla *scintilla = new QsciScintilla;
                scintilla->show();
                return app.exec();
            }

Si l'on compile, on devrait se retrouver avec :

Image non disponible

IV. Colorions nos textes

Il y a énormément de langages que peut colorier syntaxique QScintilla, les voici :

  1. Bash ;
  2. Batch ;
  3. CMake ;
  4. CPP ;
  5. CSharp ;
  6. CSS ;
  7. D ;
  8. Diff ;
  9. Fortran ;
  10. Fortran77 ;
  11. HTML ;
  12. IDL ;
  13. Java ;
  14. JavaScript ;
  15. Lua ;
  16. Makefile ;
  17. Pascal ;
  18. Perl ;
  19. PostScript ;
  20. POV ;
  21. Properties ;
  22. Python ;
  23. Ruby ;
  24. SQL ;
  25. TCL ;
  26. TeX ;
  27. VHDL ;
  28. XML ;
  29. YAML.

Dans QScintilla l'objet pour colorier la syntaxe d'un QsciScintilla s'appelle un lexer.
Le nom de la classe du lexer de C++ est : QsciLexerCPP.
Celui de Java c'est : QsciLexerJava.

Les fichiers à inclure sont donc pour le lexer de C++ : #include<Qsci/qscilexercpp.h>

Pour attribuer un lexer à un QsciScintilla, il faut utiliser la méthode : virtual void QsciScintilla::setLexer (QsciLexer *lexer=0)

Voici un exemple de code que l'on peut obtenir :

 
Sélectionnez
#include <QApplication>
#include <Qsci/qsciscintilla.h>
#include <Qsci/qscilexercpp.h>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QsciScintilla *scintilla = new QsciScintilla;
    QsciLexerCPP *lexerCPP = new QsciLexerCPP;
    scintilla->setLexer(lexerCPP);
    scintilla->show();
return app.exec();
}

Une petite capture d'écran :) :

Image non disponible

Il est aussi possible de modifier les couleurs des lexers.
Sur la documentation de QsciLexerCPP, il y a l'énumération :

 
Sélectionnez
Default = 0, Comment = 1, CommentLine = 2,
CommentDoc = 3, Number = 4, Keyword = 5,
DoubleQuotedString = 6, SingleQuotedString = 7, UUID = 8,
PreProcessor = 9, Operator = 10, Identifier = 11,
UnclosedString = 12, VerbatimString = 13, Regex = 14,
CommentLineDoc = 15, KeywordSet2 = 16, CommentDocKeyword = 17,
CommentDocKeywordError = 18, GlobalClass = 19

Ce sont les mots-clés que l'on peut modifier :

  • Default = azertyuiopqsdfghjklmwxcvbn ;
  • Comment = /* azertyuiopqsdfghjklmwxcvbn */
  • CommentLine = // azertyuiopqsdfghjklmwxcvbn
  • Number = 0123456789
  • Keyword = int const mutable void operator
  • DoubleQuotedString = "blablabla"
  • SingleQuotedString = 'blablabla'
  • PreProcessor = #include #define #ifndef
  • Operator = + - * / = << >>
  • UnclosedString = Quand une chaine n'est pas fermée "blablabla

Pour changer la couleur, il faut utiliser la méthode : virtual void setColor (const QColor &c, int style=-1)

Exemple : pour avoir les mots-clés en violet :

 
Sélectionnez
QsciLexerCPP lexer;
lexer.setColor(Qt::magenta, QsciLexerCPP::Keyword);

Si vous ne trouvez pas d'énumération pour la couleur dans la classe d'un lexer, regardez dans sa classe mère.

V. Lignes numérotées

Dans QScintilla, il est possible d'ajouter une marge qui contient les numéros de ligne des zones de texte.

Pour afficher la marge, il faut utiliser : virtual void setMarginLineNumbers(int margin, bool lnrs)

(Il peut y avoir plusieurs marges.)
Voici un exemple de code possible :

 
Sélectionnez
#include <QApplication>
#include <Qsci/qsciscintilla.h>
#include <Qsci/qscilexercpp.h>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QsciScintilla *scintilla = new QsciScintilla;
    QsciLexerCPP *lexerCPP = new QsciLexerCPP;
    scintilla->setLexer(lexerCPP);
    scintilla->setMarginLineNumbers(1,true);
    scintilla->show();
return app.exec();
}

Résultat :

Image non disponible

On peut agrandir la marge avec : virtual void setMarginWidth (int margin, int width)

width étant la largeur de la marge en pixel et margin le numéro de la marge.

Ou bien : virtual void setMarginWidth (int margin, const QString &s)

s étant la largeur de la marge souhaitée en caractères + 1. Par exemple, si l'on veut faire une marge de 4 caractères il faut faire 4 + 1 = 5 caractères :
setMarginWidth(1, "-----") (4 caractères + 1)

Testons cela :

 
Sélectionnez
#include <QApplication>
#include <Qsci/qsciscintilla.h>
#include <Qsci/qscilexercpp.h>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QsciScintilla *scintilla = new QsciScintilla;
    QsciLexerCPP *lexerCPP = new QsciLexerCPP;
    scintilla->setLexer(lexerCPP);
    scintilla->setMarginLineNumbers (1, true);
    scintilla->setMarginWidth(1, "-----");
    // scintilla->setMarginWidth(1, 50);
    scintilla->show();
return app.exec();
}

Résultat :

Image non disponible

Il existe encore plein de méthodes utiles/inutiles dans QScintilla. Si vous voulez les connaître, allez voir la documentation.

VI. QScintilla dans Qt Designer

Une dernière chose : il est possible d'inclure QScintilla dans Qt Designer :

  • depuis la console de Qt, déplacez-vous dans le dossier designer-Qt4 de QScintilla-gpl-2.3.2
  • puis faites :

    • qmake,
    • make,
    • make install ;
    • ou bien : qmake & make & make install (mais seulement sur Windows).

Ouvrez Qt Designer, cherchez un peu dans les widgets, et magie ! dans Input Widget il y a QsciScintilla :

Image non disponible

Pour ajouter des lexers, il est nécessaire de les coder (ce serait trop beau sinon).

Voilà cet article est fini.
J'espère qu'il vous a plu.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2008 . Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.