Russian Qt Forum
Октябрь 03, 2024, 01:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ключевые слова С++  (Прочитано 7702 раз)
pablo
Гость
« : Февраль 11, 2005, 11:28 »

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

Заранее благодарю.
Записан
RamsesIII
Гость
« Ответ #1 : Февраль 11, 2005, 11:35 »

Ispolsui class QSyntaxHighlighter
Записан
Sergeich
Гость
« Ответ #2 : Февраль 11, 2005, 11:38 »

Ищешь в тексте нужные слова и окружаешь тэгами
<font color="#5500ff">keyword</font>
Записан
pablo
Гость
« Ответ #3 : Февраль 11, 2005, 13:51 »

А как именно искать ?
Если функцией find(), то чёто она мне ничего никогда не находит.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #4 : Февраль 11, 2005, 14:10 »

используй

QRegExp
The QRegExp class provides pattern matching using regular expressions. More...
Записан
pablo
Гость
« Ответ #5 : Февраль 11, 2005, 15:02 »

Допустим я использую QRegExp как я понял из документации, то етот класс изобилует функциями поиска в строке, но мне надо не только найти слова, но и их закрасить другим цветом. Разве этот класс предлогает такую возможность, если да то какой его метод ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Февраль 11, 2005, 15:04 »

да не советовал бы. эта штука и глючная, и тормознутая...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
pablo
Гость
« Ответ #7 : Февраль 11, 2005, 19:55 »

Ну я поискал в документации и нашёл там класс QSyntaxHighlighter, он обеспечивает какраз то, что надо. Только проблема вот в чем :
Там сказано переопределить функцию  highlightParagraph(), но как это делается там не написали. Может кто знает как это делается Непонимающий
Записан
developer
Гость
« Ответ #8 : Декабрь 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);
    }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.151 секунд. Запросов: 23.