1、概述
QSyntaxHighlighter是Qt文本处理框架中的一个强大工具,它专门用于实现文本编辑器中的语法高亮功能。通过自定义高亮规则,QSyntaxHighlighter可以实现对代码编辑器、富文本编辑器中的关键字、注释等内容的高亮显示。这一功能对于提升代码的可读性和编辑效率具有重要意义。
2、重要方法
- QSyntaxHighlighter(QObject *parent):通过父对象构造。
- QSyntaxHighlighter(QTextDocument *parent):通过文本文档构造。
- void setDocument(QTextDocument *doc):设置语法高亮器关联的文本文档。
- QTextDocument *document()const:返回语法高亮器关联的文本文档
- virtual void highlightBlock(const Qstring &text):纯虚函数,需要在子类中实现,用于高亮显示指定文本块。
//.h
class SyntaxHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
SyntaxHighlighter(QTextDocument *parent = nullptr);
protected:
void highlightBlock(const QString &text) override;
private:
void setupHighlightingRules();
struct HighlightingRule
{
QRegExp pattern;
QTextCharFormat format;
};
QVector<HighlightingRule> highlightingRules;
QTextCharFormat keywordFormat;
QTextCharFormat commentFormat;
};
//.cpp
SyntaxHighlighter::SyntaxHighlighter(QTextDocument *parent)
: QSyntaxHighlighter(parent)
{
setupHighlightingRules();
}
void SyntaxHighlighter::setupHighlightingRules()
{
HighlightingRule rule;
// 关键字高亮规则
keywordFormat.setForeground(Qt::blue);
keywordFormat.setFontWeight(QFont::Bold);
QStringList keywordPatterns;
keywordPatterns << "\\bint\\b" << "\\bfloat\\b" << "\\bdouble\\b" << "\\bchar\\b"
<< "\\bvoid\\b" << "\\bif\\b" << "\\belse\\b" << "\\bfor\\b"
<< "\\bwhile\\b" << "\\breturn\\b";
foreach (const QString &pattern, keywordPatterns) {
rule.pattern = QRegExp(pattern);
rule.format = keywordFormat;
highlightingRules.append(rule);
}
// 注释高亮规则
commentFormat.setForeground(Qt::darkGray);
commentFormat.setFontItalic(true);
rule.pattern = QRegExp("//[^\n]*");
rule.format = commentFormat;
highlightingRules.append(rule);
}
void SyntaxHighlighter::highlightBlock(const QString &text)
{
foreach (const HighlightingRule &rule, highlightingRules) {
QRegExp expression(rule.pattern);
int index = expression.indexIn(text);
while (index >= 0) {
int length = expression.matchedLength();
setFormat(index, length, rule.format);
index = expression.indexIn(text, index + length);
}
}
}
//main.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextEdit textEdit;
textEdit.setPlainText("int main() { if (true) { return 0; } }"); // 设置示例文本
// 创建并应用Highlighter实例
SyntaxHighlighter *highlighter = new SyntaxHighlighter(textEdit.document());
textEdit.show();
return a.exec();
}
觉得有帮助的话,打赏一下呗。。