Utilisation de QSyntaxHighlighter
Bonjour,
J'utilise la classe QSyntaxHighlighter associée à un QTextEdit pour éditer et faire de la colorisation syntaxique d'un texte.
Mais voila au delà de quelques milliers de lignes cela devient horriblement long de coloriser le texte, je dirais 1s pour quelques centaines de lignes
Alors ca me parait bizarre que ce soit si peu performant sachant que j'utilise l'exemple fourni par Qt.
Merci d'avance de vos suggestions
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
#ifndef HIGHLIGHTER_H
#define HIGHLIGHTER_H
#include <QSyntaxHighlighter>
#include <QTextCharFormat>
class Highlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
Highlighter(QTextDocument *parent);
protected:
void highlightBlock(const QString &text);
private:
struct HighlightingRule
{
QRegExp pattern;
QTextCharFormat format;
};
QVector<HighlightingRule> highlightingRules;
QRegExp commentStartExpression;
QRegExp commentEndExpression;
QTextCharFormat multiLineCommentFormat;
};
#endif
Highlighter::Highlighter(QTextDocument *parent) : QSyntaxHighlighter(parent)
{
QTextCharFormat keywordFormat;
QTextCharFormat singleLineCommentFormat;
HighlightingRule rule;
QStringList keywordPatterns;
highlightingRules.clear();
keywordFormat.setFontWeight(QFont::Bold);
keywordFormat.setForeground(Qt::black);
rule.pattern = QRegExp("\\bTOTO[^\n]*\\b");
rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
rule.format = keywordFormat;
highlightingRules.append(rule);
keywordFormat.setForeground(Qt::blue);
rule.pattern = QRegExp("\\bTATA[^\n]*\\b");
rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
rule.format = keywordFormat;
highlightingRules.append(rule);
keywordFormat.setForeground(Qt::darkGreen);
rule.pattern = QRegExp("\\bTITI[^\n]*\\b");
rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
rule.format = keywordFormat;
highlightingRules.append(rule);
// commentaire avec ';' ou le mot 'END'
singleLineCommentFormat.setForeground(Qt::gray);
rule.pattern = QRegExp(";[^\n]*");
rule.format = singleLineCommentFormat;
highlightingRules.append(rule);
multiLineCommentFormat.setForeground(Qt::gray);
commentStartExpression.setCaseSensitivity(Qt::CaseInsensitive);
commentStartExpression = QRegExp("\\bEND\\b");
commentEndExpression = QRegExp("\\bendding\\b");
}
//-----------------------------------------------------------------------------------------------------------------------------
void Highlighter::highlightBlock(const QString &text)
{
QString text2,text2U;
int index,length;
foreach (HighlightingRule rule, highlightingRules) {
QRegExp expression(rule.pattern);
index = text2.indexOf(expression);
while (index >=0) {
QCoreApplication::processEvents();
length = expression.matchedLength();
setFormat(index, length,rule.format);
}
}
setCurrentBlockState(0);
int startIndex = 0;
if (previousBlockState() != 1) startIndex = text2.indexOf(commentStartExpression);
while (startIndex >= 0) {
int endIndex = text2.indexOf(commentEndExpression, startIndex);
int commentLength;
if (endIndex == -1) {
setCurrentBlockState(1);
commentLength = text2.length() - startIndex;
}
else {
commentLength = endIndex - startIndex + commentEndExpression.matchedLength();
}
if (text2U.contains("END")) setFormat(startIndex+3, commentLength, multiLineCommentFormat);
else setFormat(startIndex, commentLength, multiLineCommentFormat);
startIndex = text2.indexOf(commentStartExpression,startIndex + commentLength);
}
} |