Qt QPlainTextEdit高亮显示当前行-LMLPHP

Qt QPlainTextEdit高亮显示当前行


关键字: QtQPlainTextEditQTextBlockExtraSelectionGPT

摘要

今天要在说一下GPT,当下如果你还不会用GPT,那得推荐你学习一下,这个东西可比百度好的的。如果没有GPT,那我今天分享的内容,还需要在手打一次了。因为我公司没有网,代码也没法直接复制粘贴出来。

回到正题,今天我们需要 在QPlainTextEdit中实现高亮当前行显示。

错误的代码

在这段代码中,我们定义了一个HighlightCurrentLinePlainTextEdit类,继承自QPlainTextEdit。我们重写了paintEvent来绘制背景色,同时通过cursorPositionChanged信号来触发当前行的高亮。每当光标移动时,highlightCurrentLine槽会被调用,它会创建一个ExtraSelection来指定当前光标所在行的背景色,并将它设置成QPlainTextEditextraSelections

#include <QPlainTextEdit>
#include <QPainter>
#include <QTextBlock>

class HighlightCurrentLinePlainTextEdit : public QPlainTextEdit {
    Q_OBJECT

public:
    HighlightCurrentLinePlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {
        connect(this, &QPlainTextEdit::cursorPositionChanged,
                this, &HighlightCurrentLinePlainTextEdit::highlightCurrentLine);
        highlightCurrentLine();
    }

protected:
    void paintEvent(QPaintEvent *e) override {
        QPlainTextEdit::paintEvent(e);

        QPainter painter(viewport());
        QRect rect = cursorRect();
        QRect lineRect = QRect(0, rect.y(), viewport()->width(), rect.height());
        QColor color = QColor(Qt::yellow).lighter(160);
        painter.fillRect(lineRect, color);
    }

private slots:
    void highlightCurrentLine() {
        QList<QTextEdit::ExtraSelection> extraSelections;

        if (!isReadOnly()) {
            QTextEdit::ExtraSelection selection;

            QColor lineColor = QColor(Qt::yellow).lighter(160);

            selection.format.setBackground(lineColor);
            selection.format.setProperty(QTextFormat::FullWidthSelection, true);
            selection.cursor = textCursor();
            selection.cursor.clearSelection();
            extraSelections.append(selection);
        }

        setExtraSelections(extraSelections);
    }
};

#include "main.moc"

如果按照上面的的写法,你会发现你的文字就不见了,所以还需要改良一下才可以用。

正确的代码

在这段代码中,我们移除了paintEvent方法的覆写,因为这个方法会影响文本的正常显示。我们通过ExtraSelections机制来高亮当前行,它不会干扰文本的显示。

#include <QApplication>
#include <QPlainTextEdit>

class HighlightCurrentLinePlainTextEdit : public QPlainTextEdit {
Q_OBJECT

public:
    explicit HighlightCurrentLinePlainTextEdit(QWidget *parent = nullptr) {
        connect(this, &QPlainTextEdit::cursorPositionChanged, this, &HighlightCurrentLinePlainTextEdit::highlightCurrentLine);
        // 初始化高亮
        highlightCurrentLine();
    }

private slots:
    void highlightCurrentLine() {
        QList<QTextEdit::ExtraSelection> extraSelections;

        if (!isReadOnly()) {
            QTextEdit::ExtraSelection selection;

            QColor lineColor = QColor(Qt::yellow).lighter(160);

            selection.format.setBackground(lineColor);
            selection.format.setProperty(QTextFormat::FullWidthSelection, true);
            selection.cursor = textCursor();
            selection.cursor.clearSelection();
            extraSelections.append(selection);
        }

        setExtraSelections(extraSelections);
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    HighlightCurrentLinePlainTextEdit editor;
    editor.show();
    return QApplication::exec();
}

#include "main.moc"

QTextEdit::ExtraSelection

QTextEdit::ExtraSelection 是一个在 QTextEdit 控件中用来表示额外的文本选择的结构。在 Qt 框架中,QTextEdit 是一个富文本编辑器控件,它可以用来显示和编辑富文本文档。默认情况下,用户可以在文本编辑器中选择文本,但有时候,开发者可能希望高亮显示文本的其他部分而不影响用户的当前选择。ExtraSelection 提供了这种功能。

ExtraSelection 结构有两个主要的成员:

  1. QTextCursor cursor:这个 QTextCursor 用来指定要高亮显示的文本范围。你可以设置它选择一个词、一行或者文档中的任何段落。

  2. QTextCharFormat format:这个 QTextCharFormat 用来指定高亮显示的样式,比如背景色、文本颜色、下划线等。

你可以创建一个 ExtraSelection 的列表,并通过调用 QTextEditsetExtraSelections() 方法来设置这个列表,QTextEdit 将会绘制出这些额外的选择区域。这通常用于诸如代码高亮、拼写错误提示等场景。

以下是一个 QTextEdit::ExtraSelection 用法的简单例子:

QTextEdit *editor = new QTextEdit;

// 创建一个额外的选择
QTextEdit::ExtraSelection selection;

// 设置选择范围
selection.cursor = QTextCursor(editor->document()->findBlockByNumber(10)); // 选择第11行(假设行号从0开始)
selection.cursor.select(QTextCursor::LineUnderCursor);

// 设置选择的格式(比如,蓝色背景)
selection.format.setBackground(Qt::blue);
selection.format.setForeground(Qt::white);

// 应用额外的选择
editor->setExtraSelections(QList<QTextEdit::ExtraSelection>() << selection);

在这个例子中,QTextEdit 的第11行将被一个蓝色背景和白色前景的样式高亮显示。这种方式不会干扰用户的正常选择,而是作为一种额外的视觉提示。


Qt QPlainTextEdit高亮显示当前行-LMLPHP
02-03 01:08