Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: pablo от Февраль 11, 2005, 11:28



Название: Ключевые слова С++
Отправлено: pablo от Февраль 11, 2005, 11:28
Смотрите В QTextEdit написана самая примитивная прога на с++.
Короче проблема такая: Как мне используя QTextEdit другим цветом закрасить ключевые слова с++.
Может вы могли бы предложит какой нибудь способ достигнуть етого.

Заранее благодарю.


Название: Ключевые слова С++
Отправлено: RamsesIII от Февраль 11, 2005, 11:35
Ispolsui class QSyntaxHighlighter


Название: Ключевые слова С++
Отправлено: Sergeich от Февраль 11, 2005, 11:38
Ищешь в тексте нужные слова и окружаешь тэгами
<font color="#5500ff">keyword</font>


Название: Ключевые слова С++
Отправлено: pablo от Февраль 11, 2005, 13:51
А как именно искать ?
Если функцией find(), то чёто она мне ничего никогда не находит.


Название: Ключевые слова С++
Отправлено: Admin от Февраль 11, 2005, 14:10
используй

QRegExp
The QRegExp class provides pattern matching using regular expressions. More...


Название: Ключевые слова С++
Отправлено: pablo от Февраль 11, 2005, 15:02
Допустим я использую QRegExp как я понял из документации, то етот класс изобилует функциями поиска в строке, но мне надо не только найти слова, но и их закрасить другим цветом. Разве этот класс предлогает такую возможность, если да то какой его метод ?


Название: Ключевые слова С++
Отправлено: Racheengel от Февраль 11, 2005, 15:04
да не советовал бы. эта штука и глючная, и тормознутая...


Название: Ключевые слова С++
Отправлено: pablo от Февраль 11, 2005, 19:55
Ну я поискал в документации и нашёл там класс QSyntaxHighlighter, он обеспечивает какраз то, что надо. Только проблема вот в чем :
Там сказано переопределить функцию  highlightParagraph(), но как это делается там не написали. Может кто знает как это делается ???


Название: Re: Ключевые слова С++
Отправлено: developer от Декабрь 26, 2007, 13:26
Я сделал ето так:
---------------------------------------------
highlighter.h
----------------------------------------------
class Highlighter : public QSyntaxHighlighter
{
    Q_OBJECT

public:
    Highlighter(QTextEdit *parent = 0);

protected:
    void highlightBlock(const QString &text);

private:
    struct HighlightingRule
    {
        QRegExp pattern;
        QTextCharFormat format;
    };
    QVector<HighlightingRule> highlightingRules;

    QRegExp commentStartExpression;
    QRegExp commentEndExpression;

    QTextCharFormat keywordFormat;
    QTextCharFormat quotationFormat;
    QTextCharFormat singleLineCommentFormat;
    QTextCharFormat multiLineCommentFormat;
};
//=========================
highlighter.cpp
//========================
Highlighter::Highlighter(QTextEdit *parent)
    : QSyntaxHighlighter(parent)
{
    HighlightingRule rule;
   
    keywordFormat.setForeground(Qt::red);
    keywordFormat.setFontWeight(QFont::Bold);
    QStringList keywordPatterns;
   keywordPatterns << "\\babs\\b"<<"\\babsolute\\b"<<"\\baccess\\b"<<"\\bacos\\b"<<"\\badd\\b"<<"\\badd_months\\b"
   <<"\\badddate\\b"<<"\\badmin\\b"<<"\\bafter\\b"<<"\\baggregate\\b"<<"\\ball\\b"<<"\\ballocate\\b"<<"\\balter\\b"<<"\\band\\b"
   <<"\\bany\\b"<<"\\bapp_name\\b"<<"\\bare\\b"<<"\\barray\\b"<<"\\bas\\b"<<"\\basc\\b"<<"\\bascii\\b"<<"\\basin\\b"<<"\\bassertion\\b"
   /*здесь пишем свои ключевие слова*/
   
    foreach (QString pattern, keywordPatterns) {// foreach зарезервированное слово QT
        rule.pattern = QRegExp(pattern);             //для каждого ключевого слова создаем свой формат
        rule.format = keywordFormat;
        highlightingRules.append(rule);
    }

    singleLineCommentFormat.setForeground(Qt::red);
    rule.pattern = QRegExp("//[^\n]*");
    rule.format = singleLineCommentFormat;
    highlightingRules.append(rule);

   quotationFormat.setForeground(Qt::green);
    rule.pattern = QRegExp("\".*\"");
    rule.format = quotationFormat;
    highlightingRules.append(rule);   
   
    multiLineCommentFormat.setForeground(Qt::blue);

    commentStartExpression = QRegExp("/\\*");
    commentEndExpression = QRegExp("\\*/");
// задаем цвета для каждой групы ключевых слов, скобок и т.д.
}

void Highlighter::highlightBlock(const QString &text)
{
/*переопределяем функцию highlightBlock*/   
foreach (HighlightingRule rule, highlightingRules) {
       rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
        QRegExp expression(rule.pattern);
        int index = text.indexOf(expression);
        while (index >= 0) {
            int length = expression.matchedLength();
            setFormat(index, length, rule.format);
            index = text.indexOf(expression, index + length);
        }
    }
    setCurrentBlockState(0);

    int startIndex = 0;
    if (previousBlockState() != 1)
        startIndex = text.indexOf(commentStartExpression);

    while (startIndex >= 0) {
        int endIndex = text.indexOf(commentEndExpression, startIndex);
        int commentLength;
        if (endIndex == -1) {
            setCurrentBlockState(1);
            commentLength = text.length() - startIndex;
        } else {
            commentLength = endIndex - startIndex
                            + commentEndExpression.matchedLength();
        }
        setFormat(startIndex, commentLength, multiLineCommentFormat);
        startIndex = text.indexOf(commentStartExpression,
                                                startIndex + commentLength);
    }
}