Qt QPlainTextEdit高亮显示当前行
关键字:
Qt
、 QPlainTextEdit
、 QTextBlock
、 ExtraSelection
、 GPT
摘要
今天要在说一下GPT,当下如果你还不会用GPT,那得推荐你学习一下,这个东西可比百度好的的。如果没有GPT,那我今天分享的内容,还需要在手打一次了。因为我公司没有网,代码也没法直接复制粘贴出来。
回到正题,今天我们需要 在QPlainTextEdit
中实现高亮当前行显示。
错误的代码
在这段代码中,我们定义了一个HighlightCurrentLinePlainTextEdit
类,继承自QPlainTextEdit
。我们重写了paintEvent
来绘制背景色,同时通过cursorPositionChanged
信号来触发当前行的高亮。每当光标移动时,highlightCurrentLine
槽会被调用,它会创建一个ExtraSelection
来指定当前光标所在行的背景色,并将它设置成QPlainTextEdit
的extraSelections
。
#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
结构有两个主要的成员:
-
QTextCursor cursor
:这个QTextCursor
用来指定要高亮显示的文本范围。你可以设置它选择一个词、一行或者文档中的任何段落。 -
QTextCharFormat format
:这个QTextCharFormat
用来指定高亮显示的样式,比如背景色、文本颜色、下划线等。
你可以创建一个 ExtraSelection
的列表,并通过调用 QTextEdit
的 setExtraSelections()
方法来设置这个列表,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行将被一个蓝色背景和白色前景的样式高亮显示。这种方式不会干扰用户的正常选择,而是作为一种额外的视觉提示。