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'autre chose comme :

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

Et beaucoup d'autre chose.

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écharger le ici :
http://www.riverbankcomputing.com/software/qscintilla/download , puis décompresser l'archive.

Si il y a un problème j'ai hébergé les fichier compresser de QScintilla sur mon serveur FTP :

QScintilla peut s'installer en librairie dynamique ou en librairie statique.

Installation en librairie 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 librairies seront dans le dossier debug (ou release)

Installation en librairie 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 (tous 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 librairies 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éé 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 langage que peux colorier 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 fermer "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 violets :

 
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 peux 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à cette article est fini.
J'espère qu'il vous a plu.