Название: Ключевые слова С++ Отправлено: 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); } } |