QTextEdit实现自定义关键字着色(代码块着色)

简介: QTextEdit实现自定义关键字着色(代码块着色)

一、功能介绍

在使用QTextEdit 编辑或者显示文本的过程中,经常需要实现关键字、或者指定的一些文本着色,显示高亮颜色,突出显示。 比如: 我们经常编写代码的IDE软件,界面上就可以根据不同的语言、不同的关键字完成各种颜色的高亮,这个功能QT的QTextEdit 完全也可以实现,并且QT官方也给出了例子代码。这篇文章参考官方提供的例子代码思路,继承QSyntaxHighlighter 类,重写highlightBlock函数,设置自己的关键字。


设置的着色文本支持正则表达式语句,核心代码示例如下:

void Highlighter::highlightBlock(const QString &text)
{
    if(word_text.isEmpty())return;
    QTextCharFormat myClassFormat;
    myClassFormat.setFontWeight(QFont::Bold);
    myClassFormat.setForeground(Qt::darkMagenta);
    //支持正则表达式
    QString pattern = word_text;
    QRegExp expression(pattern);
    int index = text.indexOf(expression);
    while (index >= 0) {
        int length = expression.matchedLength();
        setFormat(index, length, myClassFormat);
        index = text.indexOf(expression, index + length);
    }
}

image.png

image.png

二、实现方法

2.1 Highlighter.cpp

这是CPP源文件,继承QSyntaxHighlighter类。

#include "highlighter.h"
//! [0]
Highlighter::Highlighter(QTextDocument *parent)
    : QSyntaxHighlighter(parent)
{
}
void Highlighter::highlightBlock(const QString &text)
{
    if(word_text.isEmpty())return;
    QTextCharFormat myClassFormat;
    myClassFormat.setFontWeight(QFont::Bold);
    myClassFormat.setForeground(Qt::darkMagenta);
    QString pattern = word_text;
    QRegExp expression(pattern);
    int index = text.indexOf(expression);
    while (index >= 0) {
        int length = expression.matchedLength();
        setFormat(index, length, myClassFormat);
        index = text.indexOf(expression, index + length);
    }
}
/*
工程: QTextEdit_Highlight_test
日期: 2021-10-30
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 高亮的文本设置
*/
void Highlighter::SetText(QString text)
{
    word_text=text;
}

2.2 Highlighter.h

#ifndef HIGHLIGHTER_H
#define HIGHLIGHTER_H
#include <QSyntaxHighlighter>
#include <QTextCharFormat>
QT_BEGIN_NAMESPACE
class QTextDocument;
QT_END_NAMESPACE
//! [0]
class Highlighter : public QSyntaxHighlighter
{
    Q_OBJECT
public:
    Highlighter(QTextDocument *parent = 0);
    void SetText(QString text);
protected:
    void highlightBlock(const QString &text) Q_DECL_OVERRIDE;
    QString word_text;
};
//! [0]
#endif // HIGHLIGHTER_H


2.3 widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    highlighter = new Highlighter(ui->textEdit->document());
}
Widget::~Widget()
{
    delete ui;
}
/*
工程: QTextEdit_Highlight_test
日期: 2021-10-30
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 设置高亮的文本
*/
void Widget::on_pushButton_clicked()
{
    highlighter->SetText(ui->lineEdit->text());
}

2.4 widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "highlighter.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    Highlighter *highlighter;
private slots:
    void on_pushButton_clicked();
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

2.5 UI设计界面

image.png

目录
相关文章
|
C# 图形学
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
Paint事件方法中实现圆角控件不要通过事件参数`e.ClipRectangle`获取控件区域范围,原因见最后介绍;注意设置控件背景透明(参见[Winform控件优化之背景透明那些事2...
865 0
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
WPF-样式问题-ListBox或ListView中子项全填充去除边线问题
WPF-样式问题-ListBox或ListView中子项全填充去除边线问题
208 0
|
前端开发
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
545 0
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
|
Windows
C#-利用自定义控件绘制一个箭头控件
利用自定义控件绘制一个箭头控件
721 0
【MATLAB】基本绘图 ( 图形属性 | 绘图对象 | 图形属性界面 | 坐标轴属性 | 线属性 | 文本属性 | 图形属性设置策略 )(一)
【MATLAB】基本绘图 ( 图形属性 | 绘图对象 | 图形属性界面 | 坐标轴属性 | 线属性 | 文本属性 | 图形属性设置策略 )(一)
194 0
【MATLAB】基本绘图 ( 图形属性 | 绘图对象 | 图形属性界面 | 坐标轴属性 | 线属性 | 文本属性 | 图形属性设置策略 )(一)
【MATLAB】基本绘图 ( 图形属性 | 绘图对象 | 图形属性界面 | 坐标轴属性 | 线属性 | 文本属性 | 图形属性设置策略 )(二)
【MATLAB】基本绘图 ( 图形属性 | 绘图对象 | 图形属性界面 | 坐标轴属性 | 线属性 | 文本属性 | 图形属性设置策略 )(二)
325 0
【MATLAB】基本绘图 ( 图形属性 | 绘图对象 | 图形属性界面 | 坐标轴属性 | 线属性 | 文本属性 | 图形属性设置策略 )(二)
Qt编写自定义控件30-颜色多态按钮
一、前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得当时接到这个定制控件任务的时候是2016年,那时候对QPainter的使用还不是很熟悉,也就是从此控件开始,逐步研究QPainter的绘制,把所有的内置函数都使用一遍,最终用的越来越熟悉,使得后来到了心中有坐标,万物皆painter的境界,可能就像武林中所说的打通了任督二脉吧。
1190 0
|
定位技术
ArcEngine 样式对象StyleGallery的使用详解
        ArcMap里面存在很多预定义的样式对象,比如颜色、图例和各种符号等。用户也可以新建自己的样式对象,来满足实际开发的特殊需要。在进行arcgis engine 二次开发的过程中,用户可直接使用这些样式对象,以丰富制图内容,简化制图过程。
1924 0
|
C#
给WPF文字加多条修饰线
原文:给WPF文字加多条修饰线 这是上篇WPF中的文字修饰——上划线,中划线,基线与下划线 最后留给朋友思考的问题。 效果图: XAML代码:                                     ...
871 0