【Qt笔记】QTextEdit和QPlainTextEdit 控件详解

目录

引言

[一、QTextEdit 控件](#一、QTextEdit 控件)

[1.1 概述](#1.1 概述)

[1.2 主要特性](#1.2 主要特性)

[1.2.1 富文本格式支持](#1.2.1 富文本格式支持)

[1.2.2 文本颜色](#1.2.2 文本颜色)

[1.2.3 段落格式](#1.2.3 段落格式)

[1.2.4 列表支持](#1.2.4 列表支持)

[1.2.5 图片插入](#1.2.5 图片插入)

[1.2.6 超链接支持](#1.2.6 超链接支持)

[1.3 信号与槽](#1.3 信号与槽)

[1.3.1 textChanged()](#1.3.1 textChanged())

[1.3.2 cursorPositionChanged()](#1.3.2 cursorPositionChanged())

[1.3.3 selectionChanged()](#1.3.3 selectionChanged())

[1.4 文档模型](#1.4 文档模型)

[1.4.1 获取文档信息](#1.4.1 获取文档信息)

[1.4.2 查找和替换操作](#1.4.2 查找和替换操作)

[二、QPlainTextEdit 控件](#二、QPlainTextEdit 控件)

[2.1 概述](#2.1 概述)

[2.2 主要特性](#2.2 主要特性)

[2.2.1 纯文本高效处理](#2.2.1 纯文本高效处理)

[2.2.2 基本文本格式支持](#2.2.2 基本文本格式支持)

[2.3 信号与槽](#2.3 信号与槽)

[2.3.1 textChanged()](#2.3.1 textChanged())

[2.3.2 cursorPositionChanged()](#2.3.2 cursorPositionChanged())

[三、QTextEdit 与 QPlainTextEdit 的对比](#三、QTextEdit 与 QPlainTextEdit 的对比)

[3.1 功能特性](#3.1 功能特性)

[3.2 性能](#3.2 性能)

[3.3 适用场景](#3.3 适用场景)

[3.4 学习曲线](#3.4 学习曲线)

结语


引言

在图形用户界面(GUI)设计领域中,文本编辑控件是不可或缺的元素之一,它们为用户提供了输入、编辑和显示文本内容的平台。在Qt中,QTextEdit和QPlainTextEdit作为Qt框架中两个重要的文本编辑控件,各自拥有独特的特点和适用场景。本文旨在深入解析QTextEdit与QPlainTextEdit的功能、用法及其区别,帮助开发者根据实际需求选择最合适的控件来优化用户体验和应用程序性能。无论是需要支持富文本格式(如HTML、样式化文本)的场景,还是追求高效纯文本编辑的场合,通过本文的详细阐述,您都将获得全面的指导和实践建议。让我们一同探索这两个控件的奥秘,为您的Qt应用程序增添更加丰富的文本处理能力。


一、QTextEdit 控件


1.1 概述

QTextEdit 是 Qt 提供的一个功能强大的富文本编辑控件,它允许用户输入和编辑包含多种格式的文本,如字体、字号、颜色、段落样式、列表、图片等。它基于 QAbstractScrollArea 类,具备自动换行、滚动条等基本功能,适用于需要复杂文本排版的场景,比如撰写文档、邮件客户端的邮件正文编辑等。


1.2 主要特性


1.2.1 富文本格式支持

用户可以通过工具栏按钮、快捷键(类似于常见的文字处理软件)或编程方式设置文本的字体特性,如 QFont 类可以指定字体家族(如 Arial、Times New Roman 等)、字号(如 12pt、16pt 等)、加粗、倾斜、下划线等样式。例如:

cpp 复制代码
QTextEdit *textEdit = new QTextEdit(this);
QTextCursor cursor = textEdit->textCursor();
QFont font;
font.setFamily("Arial"); // 设置字体样式
font.setPointSize(14); // 设置字体大小
font.setBold(true); // 设置字体为粗体
cursor.setCharFormat(QTextCharFormat().setFont(font));
textEdit->setTextCursor(cursor);

1.2.2 文本颜色

文本颜色可以使用 QColor 类来设置,支持常见的颜色表示方式,如 RGB 值、颜色名称等。同样通过 QTextCharFormat 来应用到文本片段上:

cpp 复制代码
QColor redColor(255, 0, 0);
QTextCharFormat format;
format.setForeground(redColor);
cursor.setCharFormat(format);

1.2.3 段落格式

段落格式的对齐对于文档排版至关重要,QTextEdit 借助 QTextBlockFormat 类轻松实现多种对齐方式。

cpp 复制代码
#include <QTextEdit>
#include <QTextCursor>
#include <QTextBlockFormat>

QTextEdit* textEdit = new QTextEdit(this);
QTextCursor cursor = textEdit->textCursor();

// 居中对齐段落
QTextBlockFormat blockFormat;
blockFormat.setAlignment(Qt::AlignCenter);
cursor.mergeBlockFormat(blockFormat);

textEdit->setTextCursor(cursor);

这里创建 QTextBlockFormat 并指定对齐方式为居中对齐 Qt::AlignCenter,再通过光标将此格式应用到段落,实现段落文本在 QTextEdit 控件中的居中显示。同样,还可将对齐方式设置为 Qt::AlignLeft(左对齐)、Qt::AlignRight(右对齐)、Qt::AlignJustify(两端对齐)以满足不同排版要求。

除了段落对齐方式之外,段落缩进、悬挂缩进等格式设置也可以精确控制,满足不同的排版需求,这对于文档排版非常关键,能使文本结构清晰。以下是一个设置缩进的样例:

cpp 复制代码
// 设置段落首行缩进
blockFormat.setTextIndent(20);
// 设置悬挂缩进
blockFormat.setIndent(30);
cursor.mergeBlockFormat(blockFormat);

1.2.4 列表支持

QTextEdit 提供便捷的列表创建功能,包括有序列表和无序列表,利用 QTextListFormat 来定义列表样式。

有序列表:

cpp 复制代码
#include <QTextEdit>
#include <QTextCursor>
#include <QTextListFormat>

QTextEdit* textEdit = new QTextEdit(this);
QTextCursor cursor = textEdit->textCursor();

QTextListFormat listFormat;
listFormat.setStyle(QTextListFormat::ListDecimal);
cursor.insertList(listFormat);

textEdit->setTextCursor(cursor);

上述代码创建 QTextListFormat 并设定样式为 ListDecimal(十进制数字序号的有序列表),随后通过光标在文本光标处插入列表,后续输入的文本将自动按照有序列表格式排列,如 "1. 第一项""2. 第二项" 等。

无序列表:

cpp 复制代码
#include <QTextEdit>
#include <QTextCursor>
#include <QTextListFormat>

QTextEdit* textEdit = new QTextEdit(this);
QTextCursor cursor = textEdit->textCursor();

QTextListFormat listFormat;
listFormat.setStyle(QTextListFormat::ListDisc);
cursor.insertList(listFormat);

textEdit->setTextCursor(cursor);

这里将列表样式设置为 ListDisc(圆盘样式的无序列表),形成常见的无序列表外观,输入文本时会以 "・第一项""・第二项" 等形式呈现。


1.2.5 图片插入

可以在文本中嵌入图片,支持常见的图片格式(如 PNG、JPEG 等)。通过 QTextDocumentFragment 和 QPixmap 结合来实现,例如:

cpp 复制代码
QPixmap pixmap(":/image.png");
QTextDocumentFragment fragment = QTextDocumentFragment::fromImage(pixmap);
textEdit->textCursor().insertFragment(fragment);

1.2.6 超链接支持

文本中的超链接能够被识别,用户点击超链接可打开对应的网页或资源。可以使用 QTextCharFormat 设置超链接的格式(如颜色、下划线样式),并关联 URL:

cpp 复制代码
#include <QTextEdit>
#include <QTextCursor>
#include <QTextCharFormat>

QTextEdit* textEdit = new QTextEdit(this);
QTextCursor cursor = textEdit->textCursor();

QTextCharFormat linkFormat;
linkFormat.setAnchor(true);
linkFormat.setForeground(Qt::blue);
linkFormat.setAnchorHref("https://www.example.com");
cursor.setCharFormat(linkFormat);

textEdit->setTextCursor(cursor);

此示例先创建 QTextCharFormat,开启锚点 setAnchor(true),设置前景色为蓝色以突出显示超链接文本,再指定目标 URL setAnchorHref("https://www.example.com"),最后通过光标将格式应用到文本,使文本变为可点击的超链接,点击后将在浏览器中打开指定网页。


1.3 信号与槽

QTextEdit 提供了丰富的信号来响应文本编辑过程中的各种事件。


1.3.1 textChanged()

只要文本内容发生任何更改,该信号就会被发射,非常适合用于实时保存文档草稿、更新相关状态信息等场景。例如:

cpp 复制代码
connect(textEdit, &QTextEdit::textChanged, this, [this]() {
    // 在这里进行保存草稿或更新界面显示相关操作
    saveDraft(); // 这个函数需要自己实现
});

每当文本编辑发生改变,textChanged 信号被触发,进而调用 saveDraft 函数实现草稿保存。


1.3.2 cursorPositionChanged()

当文本光标的位置改变时触发,对于需要根据光标位置动态调整界面元素(如显示当前段落格式工具提示)或执行特定操作(如在状态栏显示光标位置信息)很有用:

cpp 复制代码
connect(textEdit, &QTextEdit::cursorPositionChanged, this, [this]() {
    QTextCursor cursor = textEdit->textCursor();
    int position = cursor.position();
    // 更新状态栏显示光标位置
    statusBar()->showMessage(QString("Cursor at position: %1").arg(position));
});

1.3.3 selectionChanged()

当用户通过鼠标或键盘操作改变了文本选中区域时触发,可用于实现复制、剪切、粘贴等操作的相关功能,以及对选中文本进行特殊处理,如统计选中字数、更改选中文本格式等:

cpp 复制代码
connect(textEdit, &QTextEdit::selectionChanged, this, [this]() {
    QTextCursor cursor = textEdit->textCursor();
    int selectedLength = cursor.selectedText().length();
    // 更新界面显示选中字数
    selectedWordCountLabel->setText(QString("Selected words: %1").arg(selectedLength));
});

1.4 文档模型


1.4.1 获取文档信息

可以直接访问 QTextEdit 的文档对象获取字符数、段落数等信息。

cpp 复制代码
#include <QTextEdit>
#include <QTextDocument>

QTextEdit* textEdit = new QTextEdit(this);
QTextDocument* document = textEdit->document();
int charCount = document->characterCount();
int paragraphCount = document->blockCount();

上述代码获取文档对象后,分别调用 characterCount 和 blockCount 函数,得到文本中的字符总数和段落总数,便于进行文档统计分析。


1.4.2 查找和替换操作

QTextDocument 支持查找和替换文本,包括简单文本查找与正则表达式查找。

cpp 复制代码
#include <QTextDocument>

QTextEdit* textEdit = new QTextEdit(this);
QTextDocument* document = textEdit->document();
QTextCursor cursor = document->find("search term", textEdit->textCursor());
if (!cursor.isNull()) {
    // 找到了匹配文本,可进行进一步操作,如突出显示
    QTextCharFormat format;
    format.setBackground(Qt::yellow);
    cursor.mergeCharFormat(format);
}

这里在文档中查找指定文本 "search term",若找到,创建黄色背景的 QTextCharFormat 并应用到匹配文本,实现突出显示查找结果的功能。


二、QPlainTextEdit 控件


2.1 概述

QPlainTextEdit 是一个轻量级的文本编辑控件,它专注于纯文本的输入和编辑,不支持 QTextEdit 中的复杂富文本格式,如字体样式、段落对齐之外的高级排版、图片插入等。但正因为其简洁性,它在性能上更具优势,适用于处理大量纯文本的场景,如代码编辑器、日志查看器、简单的文本输入框等。


2.2 主要特性


2.2.1 纯文本高效处理

对于纯文本的读写操作速度较快,因为它不需要处理复杂的富文本格式标记和渲染。在加载大型文本文件(如代码文件、日志文件)时,相比 QTextEdit 能更快地显示内容,占用资源相对较少。例如,读取一个几十兆字节的代码文件:

cpp 复制代码
QPlainTextEdit *plainTextEdit = new QPlainTextEdit(this);
QFile file(":/large_code_file.cpp");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    QTextStream in(&file);
    plainTextEdit->setPlainText(in.readAll());
    file.close();
}

2.2.2 基本文本格式支持

虽然不支持富文本的多样化字体样式,但它保留了一些基本的文本格式控制,如换行符的正常显示,文本可以自动换行,也可以通过设置 QPlainTextEdit 的 lineWrapMode 属性来控制换行模式,如 NoWrap(不换行)、WidgetWidth(根据控件宽度换行)等:

cpp 复制代码
plainTextEdit->setLineWrapMode(QPlainTextEdit::NoWrap);

它还支持文本的选中、复制、粘贴等基本操作,这些操作的快捷键(如 Ctrl + C、Ctrl + V)与常见系统操作一致,方便用户使用。


2.3 信号与槽


2.3.1 textChanged()

同样,只要文本内容有改变,该信号就会发射,用于类似实时保存文本、更新相关统计信息等功能。例如在一个简单的文本输入日志应用中:

cpp 复制代码
connect(plainTextEdit, &QPlainTextEdit::textChanged, this, [this]() {
    saveLogEntry(); // 这个函数的具体实现也需要自己写
});

2.3.2 cursorPositionChanged()

当光标位置变动时触发,可用于在状态栏显示当前行号、列号等信息,方便用户了解在文本中的位置:

cpp 复制代码
connect(plainTextEdit, &QPlainTextEdit::cursorPositionChanged, this, [this]() {
    QTextCursor cursor = plainTextEdit->textCursor();
    int lineNumber = cursor.blockNumber() + 1;
    int columnNumber = cursor.positionInBlock() + 1;
    statusBar()->showMessage(QString("Line: %1, Column: %2").arg(lineNumber).arg(columnNumber));
});

三、QTextEdit 与 QPlainTextEdit 的对比


3.1 功能特性

QTextEdit 具有丰富的富文本功能,能创建精美的文档效果,适合需要复杂排版、图文混排、超链接等场景;而 QPlainTextEdit 专注于纯文本处理,功能简洁,更侧重文本的快速输入与高效编辑,如代码编写、大量纯文本数据查看。


3.2 性能

由于 QPlainTextEdit 不需要处理复杂的富文本渲染,在处理大量文本(尤其是纯文本)时性能更优,加载和显示速度更快;QTextEdit 在处理复杂格式时会消耗更多资源,对于性能要求苛刻且只需纯文本的场景不太适合。


3.3 适用场景

如果开发一个类似 Microsoft Word 的文档处理软件,QTextEdit 是首选;要是打造一个代码编辑器、日志监控工具,QPlainTextEdit 能更好地满足需求,提供流畅的纯文本操作体验。


3.4 学习曲线

对于初学者来说,QPlainTextEdit 相对简单,因为其功能和信号槽机制较为直接,专注于基本文本操作;QTextEdit 由于富文本格式的复杂性,涉及更多的格式类(如 QTextCharFormat、QTextBlockFormat 等)和操作逻辑,学习成本稍高,但一旦掌握能实现非常强大的文本处理功能。


结语

在 Qt 开发中,根据具体应用的功能需求、性能要求和用户体验目标,合理选择 QTextEdit 或 QPlainTextEdit 控件,能够为项目打造出高效、易用的文本编辑界面。无论是复杂的富文本创作还是简洁的纯文本处理,这两个控件都提供了坚实的基础,开发者可以在此基础上进一步扩展和定制,满足多样化的应用场景。

相关推荐
siy23331 小时前
VS2022中cmath.h头文件功能介绍
c语言·笔记·学习
陈志化2 小时前
kafka了解-笔记
笔记·分布式·kafka
jayxlb22 小时前
LLaMA-Factory 安装linux部署&conda笔记
笔记·ai·llama
Strive_Sun2 小时前
Windows 下搭建 googletest 测试框架(C/C++)
c语言·开发语言·c++·windows
向上的车轮2 小时前
OpenEuler学习笔记(二十三):在OpenEuler上部署开源MES系统
linux·笔记·学习·开源
小禾苗_2 小时前
C++ ——基础进阶
开发语言·c++
别开生面的阿杰2 小时前
C++--iomanip库
开发语言·c++
羽觞醉月112 小时前
C++基础 | 线程`std::thread`
开发语言·c++·算法
雾间云3 小时前
Qt简单使用正则表达式
开发语言·qt·正则表达式
不想编程小谭3 小时前
从小白开始的动态规划
c++·算法·动态规划